Saya telah memasukkan catatan ke tabel database SQL Server. Tabel memiliki kunci utama yang ditentukan dan seed identitas kenaikan otomatis diatur ke "Ya". Ini dilakukan terutama karena dalam SQL Azure, setiap tabel harus memiliki kunci utama dan identitas yang ditentukan.
Tetapi karena saya harus menghapus beberapa catatan dari tabel, seed identitas untuk tabel-tabel itu akan terganggu dan kolom indeks (yang dihasilkan secara otomatis dengan selisih 1) akan terganggu.
Bagaimana saya bisa mereset kolom identitas setelah saya menghapus catatan sehingga kolom memiliki urutan dalam urutan numerik naik?
Kolom identitas tidak digunakan sebagai kunci asing di mana pun dalam basis data.
Jawaban:
The
DBCC CHECKIDENT
perintah manajemen digunakan untuk me-reset counter identitas. Sintaks perintahnya adalah:Contoh:
Itu tidak didukung di versi sebelumnya dari Azure SQL Database, tetapi didukung sekarang.
Harap dicatat bahwa
new_reseed_value
argumen bervariasi di seluruh versi SQL Server sesuai dengan dokumentasi :Namun, saya menemukan informasi ini menyesatkan (hanya salah sebenarnya) karena perilaku yang diamati menunjukkan bahwa setidaknya SQL Server 2012 masih menggunakan new_reseed_value + logika nilai kenaikan saat ini. Microsoft bahkan bertentangan dengan yang
Example C
ditemukan di halaman yang sama:Namun, ini semua meninggalkan opsi untuk perilaku yang berbeda pada versi SQL Server yang lebih baru. Saya kira satu-satunya cara untuk memastikan, sampai Microsoft menjernihkan hal-hal dalam dokumentasinya sendiri, adalah dengan melakukan tes yang sebenarnya sebelum digunakan.
sumber
DBCC CHECKIDENT
didukung pada rilis mendatang (V12 / Sterling): azure.microsoft.com/en-us/documentation/articles/… Meskipun, untuk situasi khusus ini, saya masih akan merekomendasikan TRUNCATE TABLE :)Di mana 0 adalah
identity
nilai Mulaisumber
TRUNCATE
, maka nilai seed baru harus menjadi nilai untuk digunakan berikutnya (yaitu 1 bukan 0). Jika tabel tidak kosong itu akan menggunakan tabelnew_reseed_value + 1
. MSDNDELETE
, tidakTRUNCATE
, dalam hal ini juganew_reseed+value + 1
. Saya menulis posting tentang ini, menunjukkan perilaku aktual melalui beberapa tes, dan memperbarui dokumen yang sebenarnya (sekarang kita dapat karena itu berada di GitHub): Bagaimana DBID CHECKIDENT Benar-Benar Bekerja Ketika Mengatur Ulang Benih Identitas (RESEED)? .Harus dicatat bahwa JIKA semua data dihapus dari tabel melalui
DELETE
(yaitu tidak adaWHERE
klausa), maka selama a) izin untuk itu, dan b) tidak ada FK yang merujuk tabel (yang tampaknya menjadi kasus di sini), menggunakanTRUNCATE TABLE
akan lebih disukai karena melakukan lebih efisienDELETE
dan me-resetIDENTITY
benih pada saat yang sama. Detail berikut diambil dari halaman MSDN untuk TRUNCATE TABLE :Jadi yang berikut ini:
Menjadi adil:
Silakan lihat
TRUNCATE TABLE
dokumentasi (ditautkan di atas) untuk informasi tambahan tentang pembatasan, dll.sumber
Meskipun sebagian besar jawaban menyarankan RESEED ke 0, tetapi seringkali kita perlu kembali ke Id berikutnya yang tersedia
Ini akan memeriksa tabel dan mengatur ulang ke ID berikutnya.
sumber
declare @max int select @max=ISNULL(max([Id]),0) from [TestTable]; DBCC CHECKIDENT ('[TestTable]', RESEED, @max );
Saya mencoba
@anil shahs
menjawab dan itu mereset identitas. Tetapi ketika baris baru dimasukkan itu mendapatidentity = 2
. Jadi alih-alih saya mengubah sintaks menjadi:Maka baris pertama akan mendapatkan identitas = 1.
sumber
Meskipun sebagian besar jawaban menyarankan
RESEED
untuk0
, dan sementara beberapa melihat ini sebagai sebuah cacat untukTRUNCATED
tabel, Microsoft memiliki solusi yang tidak termasuk dalamID
Ini akan memeriksa tabel dan mengatur ulang ke yang berikutnya
ID
. Ini telah tersedia sejak MS SQL 2005 hingga saat ini.https://msdn.microsoft.com/en-us/library/ms176057.aspx
sumber
Checking identity information: current identity value '[incorrect seed]', current column value '[correct seed]'.
tetapi pada sisipan baru masih menggunakan seed yang salah.mengeluarkan 2 perintah dapat melakukan triknya
yang pertama mengatur ulang identitas ke nol, dan selanjutnya akan mengaturnya ke nilai berikutnya yang tersedia - jacob
sumber
@ jacob
Berhasil bagi saya, saya hanya perlu menghapus semua entri terlebih dahulu dari tabel, lalu menambahkan di atas pada titik pemicu setelah dihapus. Sekarang setiap kali saya menghapus entri diambil dari sana.
sumber
Truncate
tabel lebih disukai karena membersihkan catatan, mengatur ulang penghitung dan mendapatkan kembali ruang disk.Delete
danCheckIdent
harus digunakan hanya jika kunci asing mencegah Anda memotong.sumber
Setel ulang kolom identitas dengan id baru ...
sumber
Ini adalah pertanyaan umum dan jawabannya selalu sama: jangan lakukan itu. Nilai identitas harus diperlakukan sebagai sewenang-wenang dan, dengan demikian, tidak ada urutan "benar".
sumber
Jalankan skrip ini untuk mereset kolom identitas. Anda harus melakukan dua perubahan. Ganti tableXYZ dengan tabel apa pun yang Anda perlu perbarui. Juga, nama kolom identitas perlu dihapus dari tabel temp. Ini instan di atas meja dengan 35.000 baris & 3 kolom. Jelas, buat cadangan tabel dan coba ini dulu di lingkungan pengujian.
sumber
Ini akan menetapkan nilai identitas saat ini ke 0.
Saat memasukkan nilai berikutnya, nilai identitas akan bertambah menjadi 1.
sumber
Gunakan prosedur tersimpan ini:
Hanya meninjau kembali jawaban saya. Saya menemukan perilaku aneh di sql server 2008 r2 yang harus Anda waspadai.
Pilih pertama menghasilkan
0, Item 1
.Yang kedua menghasilkan
1, Item 1
. Jika Anda menjalankan pengaturan ulang tepat setelah tabel dibuat, nilai selanjutnya adalah 0. Jujur, saya tidak terkejut Microsoft tidak bisa memperbaiki masalah ini. Saya menemukannya karena saya memiliki file skrip yang mengisi tabel referensi yang kadang-kadang saya jalankan setelah saya membuat kembali tabel dan kadang-kadang ketika tabel sudah dibuat.sumber
Saya menggunakan skrip berikut untuk melakukan ini. Hanya ada satu skenario di mana ia akan menghasilkan "kesalahan", yaitu jika Anda telah menghapus semua baris dari tabel, dan
IDENT_CURRENT
saat ini diatur ke 1, yaitu hanya ada satu baris dalam tabel untuk memulai.sumber
Untuk baris DELETE lengkap dan setel ulang jumlah IDENTITAS, saya menggunakan ini (SQL Server 2008 R2)
sumber
Pemasangan kembali ke 0 tidak terlalu praktis kecuali Anda membersihkan meja secara keseluruhan.
bijaksana jawaban yang diberikan oleh Anthony Raymond sempurna. Dapatkan max dari kolom identitas terlebih dahulu, lalu seed dengan max.
sumber
Saya sudah mencoba menyelesaikan ini untuk sejumlah besar tabel selama pengembangan, dan ini berfungsi sebagai pesona.
Jadi, pertama-tama Anda memaksakannya untuk diatur ke 1, lalu Anda mengaturnya ke indeks tertinggi dari baris yang ada di tabel. Sisa idex yang cepat dan mudah.
sumber
Itu selalu lebih baik untuk menggunakan TRUNCATE bila memungkinkan daripada menghapus semua catatan karena tidak menggunakan ruang log juga.
Jika kita perlu menghapus dan perlu mengatur ulang seed, selalu ingat bahwa jika tabel tidak pernah diisi dan Anda menggunakan
DBCC CHECKIDENT('tablenem',RESEED,0)
maka record pertama akan mendapatkan identitas = 0 seperti yang dinyatakan pada dokumentasi msdnsumber
TRUNCATE
akan mencegahROLLBACK
berperilaku seperti yang diharapkan? ROLLBACK masih bergulir. Bahkan jika DB diatur keBULK_LOGGED
.Pertama: Spesifikasi Identitas Hanya: "Tidak" >> Simpan Proyek Jalankan Basis Data
Setelah itu: Spesifikasi Identitas Hanya: "YA" >> Simpan Proyek Jalankan Basis Data
ID Database Anda, PK Mulai dari 1 >>
sumber