Tag Archive ไพรมารีคีย์

หา id ที่ว่างอยู่มา reused

site เดิม content ติดอยู่ใน google แล้วบางส่วน แต่จำเป็นที่จะต้องลบออก แต่ลูกค้าอยากจะให้ link เดิมมันยังเข้าได้ ถึงเนื้อหาใหม่มันจะไม่เกี่ยวกับเรื่องเดิมก็ตาม (เอาเป็นว่าให้เข้ามาที่ไซต์ก่อน)

ก่อนอื่นก็หา id ในตารางที่ว่าอยู่ เพราะโดนลบออกไปแล้วก่อน ใน mySQL ก็เขียนประมาณ

SELECT a.id + 1 AS START, MIN(b.id) -1 AS END
FROM jos_modules AS a,
     jos_modules AS b
WHERE a.id < b.id
GROUP BY a.id
HAVING
START < MIN(b.id)

ที่เหลือก็เขียน code เอา id ไป reused โดยตอน INSERT / UPDATE ก็ระบุ id เข้าไปด้วย ใน mysql จะไม่ห้ามถ้าเราจะ recycle id ถึงแม้ว่าเราจะใส่ auto increment ไว้ก็ตาม ขอแค่ id ไม่ซ้ำกับที่มีอยู่เดิม

CR : Sequence gaps in MySQL
RT : https://pitt.plusmagi.com/mysql-auto-number

mysql auto number

บางตารางที่จะย้ายระบบอาจจะไม่มี primary key เพื่อให้ถูกต้องตามหลักการออกแบบตารางที่ดีจึงควรเพิ่ม pk ให้ตาราง
สมมุติตารางชื่อ contents และต้องการให้ pk ชื่อ contentId จะเขียน query ได้ตามตัวอย่าง

ALTER TABLE `contents` ADD `contentId` INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST ,
ADD PRIMARY KEY ( `contentId` )

อีกวิธีถ้าต้องการให้ primary key เรียงลำดับใหม่โดยให้ แคทตากอรี่เดียวกันอยู่ใกล้กัน หลังจากนั้นเรียงตามชื่อทำได้โดยใช้เทคนิค
row number เข้าไปทำง่ายๆ ตามตัวอย่าง

Update `contents` set `contentId` =
(select @rownum:=@rownum+1 rownum FROM (SELECT @rownum:=0) r)
ORDER BY `categoryId` ,`title`;