ฉันได้ลบบางระเบียนออกจากตารางในฐานข้อมูล SQL Server ตอนนี้ ID เปลี่ยนจาก 101 เป็น 1200 ฉันต้องการลบระเบียนอีกครั้ง แต่ฉันต้องการให้ ID กลับไปที่ 102 มีวิธีทำเช่นนี้ใน SQL Server หรือไม่
ฉันได้ลบบางระเบียนออกจากตารางในฐานข้อมูล SQL Server ตอนนี้ ID เปลี่ยนจาก 101 เป็น 1200 ฉันต้องการลบระเบียนอีกครั้ง แต่ฉันต้องการให้ ID กลับไปที่ 102 มีวิธีทำเช่นนี้ใน SQL Server หรือไม่
คำตอบ:
ออกคำสั่งต่อไปนี้เพื่อให้ mytable เริ่มต้นใหม่ที่ 1:
DBCC CHECKIDENT (mytable, RESEED, 0)
อ่านเกี่ยวกับมันใน Books on Line (BOL, SQL help) นอกจากนี้ควรระวังว่าคุณไม่มีบันทึกที่สูงกว่าเมล็ดพันธุ์ที่คุณตั้งค่า
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
ถ้า number = 0 ดังนั้นในการแทรกครั้งถัดไปฟิลด์การเพิ่มอัตโนมัติจะมีค่า 1
ถ้า number = 101 ดังนั้นในส่วนถัดไปแทรกฟิลด์การเพิ่มอัตโนมัติจะมีค่า 102
บางข้อมูลเพิ่มเติมที่ ... อาจจะเป็นประโยชน์กับคุณ
ก่อนที่จะให้เพิ่มขึ้นโดยอัตโนมัติในการค้นหาข้างต้นคุณต้องให้แน่ใจว่าคอลัมน์ที่เพิ่มขึ้นรถยนต์ตารางที่มีอยู่ของคุณมีค่าน้อยกว่าที่number
number
ในการรับค่าสูงสุดของคอลัมน์ (column_name) จากตาราง (ตารางที่ 1) คุณสามารถใช้แบบสอบถามต่อไปนี้
SELECT MAX(column_name) FROM table1
กึ่งงี่เง่า - หลักฐาน:
declare @max int;
select @max = max(key) from table;
dbcc checkident(table,reseed,@max)
http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete
หากคุณใช้ MySQL ลองสิ่งนี้:
ALTER TABLE tablename AUTO_INCREMENT = 1
ลบและ Reseed ตารางทั้งหมดในฐานข้อมูล
USE [DatabaseName]
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" -- Disable All the constraints
EXEC sp_MSForEachTable "DELETE FROM ?" -- Delete All the Table data
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- Enable All the constraints back
-- You may ignore the errors that shows the table without Auto increment field.
ฉันคิดออก มันเป็น:
DBCC CHECKIDENT ('tablename', RESEED, newseed)
ตามคำตอบที่ยอมรับสำหรับผู้ที่พบปัญหาที่คล้ายกันโดยมีคุณสมบัติแบบแผนเต็ม:
( [MyDataBase].[MySchemaName].[MyTable]
) ... ส่งผลให้เกิดข้อผิดพลาดคุณต้องอยู่ในบริบทของฐานข้อมูลนั้น
นั่นคือสิ่งต่อไปนี้จะทำให้เกิดข้อผิดพลาด:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
ใส่ชื่อตารางที่มีคุณสมบัติครบถ้วนด้วยเครื่องหมายคำพูดเดี่ยวแทน:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
คำตอบหลายข้อแนะนำให้ใช้คำสั่งแบบนี้:
DBCC CHECKIDENT (mytable, RESEED, 0)
แต่ OP กล่าวว่า "ลบระเบียนบางส่วน" ซึ่งอาจไม่ใช่ทั้งหมดดังนั้นค่า 0 จึงไม่ใช่รายการที่ถูกต้องเสมอไป คำตอบอื่น ๆ ที่แนะนำให้ค้นหาค่าปัจจุบันสูงสุดโดยอัตโนมัติและดำเนินการกับค่านั้นใหม่ แต่จะพบปัญหาหากไม่มีระเบียนในตารางและ max () จะส่งกลับค่า NULL ความคิดเห็นที่แนะนำให้ใช้เพียง
DBCC CHECKIDENT (mytable)
เพื่อรีเซ็ตค่า แต่ความคิดเห็นอื่นระบุไว้อย่างถูกต้องว่านี่จะเป็นการเพิ่มค่าสูงสุดในตารางเท่านั้น สิ่งนี้จะไม่ลดค่าถ้ามันสูงกว่าค่าสูงสุดในตารางแล้วซึ่งเป็นสิ่งที่ OP ต้องการทำ
ทางออกที่ดีกว่ารวมความคิดเหล่านี้ CHECKIDENT แรกจะรีเซ็ตค่าเป็น 0 และอันดับที่สองจะรีเซ็ตเป็นค่าสูงสุดในตารางในกรณีที่มีระเบียนในตาราง:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
ตามที่มีการแสดงความคิดเห็นหลายรายการตรวจสอบให้แน่ใจว่าไม่มีคีย์ต่างประเทศในตารางอื่น ๆ ที่ชี้ไปยังระเบียนที่ถูกลบ มิฉะนั้นคีย์ต่างประเทศเหล่านั้นจะชี้ไปที่ระเบียนที่คุณสร้างขึ้นหลังจากการป้อนข้อมูลในตารางซ้ำอีกครั้งซึ่งแทบจะไม่ใช่สิ่งที่คุณคิด
ฉันต้องการเพิ่มคำตอบนี้เพราะDBCC CHECKIDENT
-approach จะทำให้เกิดปัญหาเมื่อคุณใช้ schema สำหรับตาราง ใช้สิ่งนี้เพื่อให้แน่ใจว่า:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
หากคุณต้องการตรวจสอบความสำเร็จของการใช้งานให้ใช้
SELECT IDENT_CURRENT(@Table);
ซึ่งควรส่งออก0
ในตัวอย่างข้างต้น
คุณไม่ต้องการทำสิ่งนี้โดยทั่วไป Reseed สามารถสร้างปัญหาความสมบูรณ์ของข้อมูล เป็นจริงเท่านั้นสำหรับใช้ในระบบการพัฒนาที่คุณเช็ดข้อมูลการทดสอบทั้งหมดและเริ่มต้นใหม่ ไม่ควรใช้กับระบบการผลิตในกรณีที่บันทึกที่เกี่ยวข้องทั้งหมดไม่ได้ถูกลบ (ไม่ใช่ทุกตารางที่ควรอยู่ในความสัมพันธ์กับคีย์ต่างประเทศคือ!) คุณสามารถสร้างความยุ่งเหยิงในการทำเช่นนี้และโดยเฉพาะอย่างยิ่งถ้าคุณตั้งใจทำอย่างสม่ำเสมอหลังจากลบทุกครั้ง มันเป็นความคิดที่ดีที่จะกังวลเกี่ยวกับช่องว่างในคุณค่าของตัวตนของคุณ
แล้วเรื่องนี้ล่ะ
ALTER TABLE `table_name`
MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
นี่เป็นวิธีที่ง่ายและรวดเร็วในการเปลี่ยนการเพิ่มอัตโนมัติเป็น 0 หรือจำนวนที่คุณต้องการ ฉันคิดออกโดยการส่งออกฐานข้อมูลและอ่านรหัสด้วยตัวเอง
คุณสามารถเขียนแบบนี้เพื่อทำให้เป็นโซลูชันบรรทัดเดียว:
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;