รีเซ็ตค่าตัวตน


16

ฉันมีตารางที่มีคอลัมน์ประจำตัว ในขณะที่กำลังพัฒนาฉันจะลบแถวเป็นครั้งคราวและเพิ่มอีกครั้ง แต่ค่าตัวตนต่าง ๆ เพิ่มขึ้นเรื่อย ๆ และไม่ได้เริ่มต้นจาก 1 เมื่อฉันเพิ่มพวกเขาอีกครั้ง ตอนนี้รหัสของฉันไปจาก 68 -> 92 และนี่ทำให้รหัสของฉันล่ม

ฉันจะรีเซ็ตค่าตัวตนได้อย่างไร


ฉันจะทำให้รหัสของฉันมีความยืดหยุ่นยิ่งขึ้นต่อค่าเอกลักษณ์ที่ขาดหายไป คอลัมน์ข้อมูลประจำตัวไม่รับประกันหมายเลขที่ต่อเนื่องกันและในที่สุดจะเกิดขึ้นได้
Trubs

คำตอบ:


29

คุณสามารถรีเซ็ตค่าตัวตนโดย

DBCC CHECKIDENT('tableName', RESEED, 0)

ดังนั้นครั้งต่อไปที่คุณแทรกลงใน TableName ค่าตัวตนที่แทรกจะเป็น 1

เมื่อคุณลบแถวออกจากตารางมันจะไม่รีเซ็ตค่ารหัสประจำตัว แต่จะเพิ่มขึ้นเรื่อย ๆ เหมือนสิ่งที่เกิดขึ้นในกรณีของคุณ

ตอนนี้เมื่อคุณตัดทอนตารางมันจะรีเซ็ตค่ารหัสประจำตัวให้เป็นค่าเริ่มต้นของตาราง

อ้างถึง: เซิร์ฟเวอร์ SQL - ลบ, ตัดและอัตลักษณ์ RESEEDสำหรับตัวอย่างรายละเอียดและคำอธิบายที่ดีของความแตกต่างระหว่างการตัดและลบ


22

Kin ได้แสดงวิธีที่คุณสามารถรีเซ็ตค่าตัวตน แต่นอกสภาพแวดล้อมการพัฒนาเมื่อคุณลบข้อมูลทั้งหมดออกจริง ๆทำไมคุณต้องทำสิ่งนี้

ฉันหวังว่าคุณจะไม่ตั้งใจที่จะรักษาลำดับของค่าตัวตนที่ต่อเนื่องกันเมื่อคุณอยู่ในการผลิต และฉันหวังว่าคุณจะไม่ได้เขียนรหัสของคุณเพื่อฮาร์ดโค้ดค่า IDENTITY หากค่าเหล่านี้เป็นค่า ID ที่มีความหมายคุณควรหยุดใช้คุณสมบัติตัวตน

มีบางสิ่งที่จะป้องกันไม่ให้เกิดเหตุการณ์เช่นนี้:

  • หากมีการกำหนดค่าตัวตนระหว่างการทำธุรกรรมและธุรกรรมถูกย้อนกลับค่าจะไม่ "ให้กลับมา" และค่าถัดไปจะเป็นค่าที่ไม่เคยใช้ + 1
  • หากแถวถูกลบในภายหลัง IDENTITY จะไม่กลับมาเติมในช่องว่าง
  • มีข้อผิดพลาดที่ใช้งานอยู่ใน SQL Server 2012 ที่จะไม่ได้รับการแก้ไขจนกว่า SQL Server 2014 จะไม่ได้รับการแก้ไข (เว้นแต่คุณจะใช้การตั้งค่าสถานะการสืบค้นกลับที่ไม่มีเอกสารและมีราคาแพงมาก) โดยการรีสตาร์ทจะปรากฏขึ้น . ข้อผิดพลาดในการเชื่อมต่อแสดงให้เห็นว่าสิ่งนี้ จำกัด อยู่ที่เหตุการณ์ความล้มเหลวที่เกี่ยวข้องกับกลุ่มความพร้อมใช้งาน แต่ฉันสามารถรับรองคุณได้ว่าข้อผิดพลาดนั้นกว้างกว่านั้นมาก

กล่าวโดยย่อหากคุณสนใจเกี่ยวกับช่องว่างหรือต้องการให้ความหมายเฉพาะกับค่าเหล่านี้หยุดใช้ตัวตน ปล่อยและสร้างตารางใหม่และเมื่อคุณต้องการลบค่าและเติมข้อมูลอีกครั้งทำการอัปเดตหรือทำการแทรกด้วยค่าที่กำหนดโค้ดยากสำหรับคอลัมน์นั้น

นอกเหนือจากนี้คีย์หลักและตัวตนไม่เหมือนกัน คอลัมน์ข้อมูลประจำตัวไม่ใช่คีย์หลักยกเว้นว่าคุณกำหนดไว้อย่างชัดเจนและคุณสามารถมีคีย์หลักที่ไม่ใช่คอลัมน์ข้อมูลประจำตัวได้


-4

หากคุณต้องการกำจัดแถวสุดท้ายที่ไม่ได้ติดตามมูลค่าที่เพิ่มขึ้นของฟิลด์ข้อมูลประจำตัวมีวิธีที่ง่ายและปลอดภัย:

  1. ก่อนอื่นลบระเบียนล่าสุดที่มี 'เพิ่มขึ้น'
  2. เปลี่ยนประเภทข้อมูลของ Identity Field ของคุณ (จาก int เป็น bigint หรือในทางกลับกัน)
  3. บันทึกตาราง
  4. เพิ่มบันทึกใหม่และตรวจสอบว่าได้กำหนดหมายเลขของค่าสูงสุด + 1
  5. แทนที่ชนิดข้อมูลของเขตข้อมูลผู้ใช้ของคุณสะดวกสำหรับความต้องการของคุณ

และคุณทำเสร็จแล้ว


3
"บันทึกตาราง" ไม่ใช่คำสั่งที่มีความหมายสำหรับ SQL Server การเปลี่ยนชนิดข้อมูลอาจไม่สำคัญโดยมีน้อยกว่า 100 แถว แต่อาจพิสูจน์ได้ว่าแพงมากสำหรับตารางขนาดใหญ่
Michael Green

2
ฉันถือว่าคุณหมายถึงใน SSMS สิ่งนี้จะสร้างตารางใหม่คัดลอกทุกแถววางตารางเก่าแล้วเปลี่ยนชื่อใหม่ และคุณต้องทำสองครั้งเพื่อสลับประเภทข้อมูลกลับ ใช้ค้อนขนาดใหญ่เพื่อแคร็ก
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.