พลิกแพลงเอาซิครับ วิธีก็คือในเมื่อมัน Auto Increment ไปเรื่อยๆ เราก็สร้าง Function ให้มัน Arrange ตัวเอง
Code (SQL)
/* สร้างตารางทดสอบ */
CREATE TABLE TestTable
(
Id INT IDENTITY PRIMARY KEY,
Name VARCHAR(10) NULL
)
/* เพิ่มข้อมูลเข้าไป 7 ค่า */
INSERT INTO TestTable (Name) VALUES ('A'),('B'),('C'),('D'),('E'),('F'),('G')
/* ทดสอบลบค่าตรงกลางออก */
DELETE FROM TestTable WHERE Id IN (2, 4, 6)
/* select ขึ้นมาดู แน่นอนว่า id แหว่ง */
SELECT * FROM TestTable
เริ่มต้นผมทดสอบนำข้อมูลเข้าไปก่อน แล้วทำให้ Id มันแหว่งไป ผลก็คือมี 4 แถว แต่ id เป็น = 1 3 5 7
แน่นอนว่าตอนนี้ SEED มันเก็บค่า 8 ถ้ามีการ Insert เพิ่มเข้าไป ค่า id ต่อไปก็คือ 8 แต่เราไม่ต้องการแบบนั้น เราต้องการให้ค่า id มันเรียงก่อน จึงทำการ Arrange แทน
Code (SQL)
/* สร้างตัวแปรเก็บค่าสูงสุด */
DECLARE @maxId int
/* สร้างตาราง Temp ตัวนี้ให้มี Structure เดียวกันกับตารางจริงนะครับ */
CREATE TABLE TempTable
(
Id INT PRIMARY KEY,
Name VARCHAR(10)
)
/* คำสั่งนี้ก็เอาข้อมูลจากตารางจริง ไปไว้ที่ Temp */
ALTER TABLE TestTable SWITCH TO TempTable;
/* สร้างการ Select ค่า ด้วย Row Number เอาเข้ามาที่ Arrange */
WITH Arrange AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY Id) AS rowNumber
FROM TempTable
)
/* สั่ง Update ค่า Id ด้วย rowNumber ที่ได้จากการ Select (Update ทั้งแผง) */
UPDATE Arrange SET Id = rowNumber
/* Select ค่าสูงสุดจาก Temp ขึ้นมาเก็บไว้ในตัวแปล @maxId */
SET @maxId = (SELECT MAX(Id) FROM TempTable)
/* เอาข้อมูลจาก Temp ทับกลับมาไว้ที่ตารางจริง */
ALTER TABLE TempTable SWITCH TO TestTable;
/* คำสั่งสำคัญ สั่งให้ SEED จำค่าใหม่ โดยให้ไปจำที่ค่า @maxId */
DBCC CHECKIDENT ("TestTable", RESEED, @maxId)
/* ทำลายตาราง Temp ซะ */
DROP TABLE TempTable;
จากคำสั่งข้างต้น ถ้าเราลอง Select ค่าดู ค่าจะเรียง Id เป็น 1,2,3,4 แล้วถ้าเรามีการ Insert ค่าใหม่ มันจะได้ id เป็น 5 ครับ
insert into table
select top 1 (t1.id+1), 'TESTTEST'
from ( select 0 as id union all select id from table) as t1
LEFT JOIN table as t2 on t2.id=t1.id+1
where t2.id is null order by t1.id
Date :
2014-10-16 16:38:23
By :
Chaidhanan
No. 6
Guest
ผมอยากรู้ การ select id แบบ random ทำไงคับใครช่วยตอบด้วยครับๆๆ