Atur ulang nilai IDENTITAS

16

Saya punya tabel dengan kolom IDENTITAS. Saat mengembangkan saya menghapus baris dari waktu ke waktu dan menambahkannya lagi. Tetapi nilai IDENTITAS selalu terus meningkat dan tidak dimulai dari 1 ketika saya menambahkannya lagi. Sekarang id saya mulai dari 68 -> 92 dan ini crash kode saya.

Bagaimana cara mereset nilai IDENTITAS?

Gijs
sumber
Saya akan membuat kode saya lebih tahan terhadap nilai identitas yang hilang. Kolom identitas tidak menjamin penomoran yang berdampingan, dan pada akhirnya akan terjadi
Trubs

Jawaban:

29

Anda dapat mengatur ulang nilai identitas dengan

DBCC CHECKIDENT('tableName', RESEED, 0)

Jadi lain kali Anda memasukkan ke TableName, nilai identitas yang dimasukkan akan 1.

Saat Anda menghapus baris dari tabel, itu tidak akan mereset nilai Identity, tetapi akan terus meningkatkannya. Sama seperti apa yang terjadi dalam kasus Anda.

Sekarang ketika Anda memotong tabel, itu akan mereset nilai Identity ke nilai Seed aslinya dari tabel.

Lihat: SQL SERVER - DELETE, TRUNCATE dan RESEED Identity untuk contoh terperinci dan beberapa penjelasan yang baik tentang Perbedaan antara Truncate dan Delete

Kin Shah
sumber
22

Kin telah menunjukkan kepada Anda bagaimana Anda dapat mereset nilai IDENTITAS, tetapi di luar lingkungan pengembangan ketika Anda benar-benar menghapus semua data, mengapa Anda perlu melakukan ini?

Saya harap Anda tidak berniat untuk mempertahankan urutan nilai IDENTITAS yang berdekatan saat Anda berada di produksi. Dan saya harap Anda tidak benar-benar menulis kode Anda ke hard-code nilai IDENTITAS. Jika ini adalah nilai ID yang berarti maka Anda harus berhenti menggunakan properti IDENTITY.

Ada beberapa hal yang akan mencegah hal ini terjadi:

  • jika nilai IDENTITAS diberikan selama transaksi, dan transaksi tersebut dibatalkan, nilai tersebut tidak "dikembalikan" dan nilai selanjutnya adalah yang tidak pernah digunakan +1.
  • jika suatu baris nanti dihapus, IDENTITY tidak pernah kembali untuk mengisi kekosongan.
  • ada bug aktif di SQL Server 2012 yang tidak akan diperbaiki sampai SQL Server 2014 tidak akan pernah diperbaiki (kecuali jika Anda menggunakan tanda bendera tidak berdokumen dan sangat mahal) di mana restart tampaknya akan membuang hingga 1000 nilai dari kolom IDENTITY Anda . Bug di Connect menunjukkan bahwa ini terbatas pada peristiwa failover yang melibatkan Grup yang Tersedia tetapi saya dapat meyakinkan Anda bahwa bug tersebut jauh lebih luas dari itu.

Singkatnya, jika Anda peduli tentang kesenjangan atau ingin memberikan nilai-nilai ini makna khusus, berhenti menggunakan IDENTITAS. Jatuhkan dan buat kembali tabel dan ketika Anda perlu menghapus nilai-nilai dan mengisi kembali, baik melakukan pembaruan, atau melakukan sisipan dengan nilai-nilai hard-kode untuk kolom itu.

Selain itu, kunci utama dan identitas bukanlah hal yang sama. Kolom identitas bukan kunci utama kecuali jika Anda secara eksplisit mendefinisikannya, dan Anda tentu dapat memiliki kunci primer yang bukan kolom identitas.

Aaron Bertrand
sumber
-4

Jika Anda hanya perlu menghilangkan baris terakhir yang belum mengikuti nilai tambahan bidang identitas, ada cara yang mudah dan aman:

  1. hapus dulu catatan terakhir yang telah 'melompat'
  2. ubah tipe data Bidang Identitas Anda (dari int ke bigint atau sebaliknya)
  3. simpan meja
  4. tambahkan catatan baru, dan periksa itu memberikan jumlah nilai tertinggi + 1
  5. Ganti tipe data Bidang Identitas Anda, sesuai kebutuhan Anda

dan kamu selesai.

Ramon Baiges Miro
sumber
3
"Simpan tabel" bukan pernyataan yang bermakna untuk SQL Server. Mengubah tipe data mungkin sepele dengan kurang dari 100 baris tetapi bisa terbukti sangat mahal untuk tabel besar.
Michael Green
2
Saya berasumsi maksud Anda dalam SSMS. Ini akan membuat tabel baru, copŷ semua baris ke dalamnya, letakkan tabel lama dan ganti nama yang baru. Dan Anda perlu melakukan ini dua kali untuk mengaktifkan kembali tipe data. Menggunakan palu godam untuk memecahkan kacang.
Martin Smith