Anda tidak dapat memperbarui kolom identitas.
SQL Server tidak memungkinkan untuk memperbarui kolom identitas tidak seperti apa yang dapat Anda lakukan dengan kolom lain dengan pernyataan pembaruan.
Meskipun ada beberapa alternatif untuk mencapai persyaratan serupa.
- Ketika nilai kolom Identitas perlu diperbarui untuk catatan baru
Gunakan DBCC CHECKIDENT yang memeriksa nilai identitas saat ini untuk tabel dan jika diperlukan, ubah nilai identitas.
DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)
- Ketika nilai kolom Identitas perlu diperbarui untuk catatan yang ada
Gunakan IDENTITY_INSERT yang memungkinkan nilai eksplisit untuk dimasukkan ke kolom identitas tabel.
SET IDENTITY_INSERT YourTable {ON|OFF}
Contoh:
-- Set Identity insert on so that value can be inserted into this column
SET IDENTITY_INSERT YourTable ON
GO
-- Insert the record which you want to update with new value in the identity column
INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue')
GO
-- Delete the old row of which you have inserted a copy (above) (make sure about FK's)
DELETE FROM YourTable WHERE ID=3
GO
--Now set the idenetity_insert OFF to back to the previous track
SET IDENTITY_INSERT YourTable OFF
UPDATE YourTable SET IdentityCol = 13
.).SET IDENTITY_INSERT YourTable ON
hanya memperbolehkan INSERT, bukan UPDATE.Jika pertanyaan Anda benar, Anda ingin melakukan sesuatu seperti
Biarkan saya memberi tahu Anda, ini bukan proses yang mudah dan tidak disarankan untuk menggunakannya, karena mungkin ada beberapa yang
foreign key
terkait dengannya.Tapi di sini ada beberapa langkah untuk melakukannya. Silakan ambil satu
back-up
mejaLangkah 1- Pilih tampilan desain tabel
Langkah 2- Matikan kolom identitas
Sekarang Anda dapat menggunakan
update
kueri.Sekarang
redo
langkah 1 dan langkah 2 dan Nyalakan kolom identitasReferensi
sumber
:)
Kamu butuh
Kemudian hapus baris Anda dan masukkan kembali dengan identitas yang berbeda.
Setelah Anda selesai memasukkan, jangan lupa mematikan identitas_insert
sumber
sumber
Coba gunakan
DBCC CHECKIDENT
:sumber
salin meja Anda ke tabel baru tanpa kolom identitas.
tambahkan kolom identitas ke tabel baru dengan seed baru dan menjadikannya sebagai kunci utama
sumber
table_name = berikan tabel yang ingin Anda setel ulang nilainya
value = nilai awal menjadi nol, untuk memulai kolom identitas dengan 1
sumber
Saat menggunakan Identity_Insert jangan lupa untuk memasukkan nama kolom karena sql tidak akan memungkinkan Anda untuk menyisipkan tanpa menentukannya
sumber
Anda juga dapat menggunakan
SET IDENTITY INSERT
untuk memungkinkan Anda memasukkan nilai ke dalam kolom identitas.Contoh:
Dan kemudian Anda dapat memasukkan ke dalam kolom identitas nilai-nilai yang Anda butuhkan.
sumber
Namun kode di atas hanya berfungsi jika tidak ada hubungan kunci primer-asing
sumber
Solusi lengkap untuk programmer C # menggunakan command builder
Pertama-tama, Anda harus mengetahui fakta ini:
Jadi, sekali tahu itu, apa yang harus Anda lakukan adalah. Baik program pernyataan Sisipan SQL Anda sendiri, atau program yang Anda miliki pembuat perintah insert. Atau gunakan yang ini yang saya programkan untuk Anda. Diberikan DataTable, menghasilkan skrip SQL Insert:
sumber
Saya telah memecahkan masalah ini terlebih dahulu menggunakan DBCC dan kemudian menggunakan insert. Misalnya jika meja Anda
Pertama-tama atur Nilai ID baru saat ini di atas tabel sebagai NEW_RESEED_VALUE
MyTable {IDCol, colA, colB}
maka Anda bisa menggunakannya
Ini akan menggandakan semua catatan Anda tetapi menggunakan nilai IDCol baru yang dimulai dengan NEW_RESEED_VALUE. Anda kemudian dapat menghapus baris duplikat Nilai ID yang lebih tinggi setelah Anda menghapus / memindahkan referensi kunci asing mereka, jika ada.
sumber
Anda bisa membuat tabel baru menggunakan kode berikut.
Kemudian hapus db lama, dan ganti nama db baru dengan nama db lama. Catatan : bahwa kolom1 dan kolom2 mewakili semua kolom di tabel lama Anda yang ingin Anda simpan di tabel baru Anda.
sumber
Jika Anda secara khusus perlu mengubah nilai kunci utama ke nomor yang berbeda (mis. 123 -> 1123). Properti identitas memblokir mengubah nilai PK. Setel Identity_insert tidak akan berfungsi. Melakukan Sisipan / Hapus tidak disarankan jika Anda memiliki penghapusan cascading (kecuali jika Anda mematikan pemeriksaan integritas referensial).
Script ini akan mematikan identitas pada PK:
Selanjutnya, Anda dapat mengatur hubungan sehingga mereka akan memperbarui referensi kunci asing. Atau Anda harus mematikan penegakan hubungan. Tautan SO ini menunjukkan caranya: Bagaimana batasan kunci asing sementara dapat dinonaktifkan menggunakan T-SQL?
Sekarang, Anda dapat melakukan pembaruan. Saya menulis sebuah skrip pendek untuk menulis semua pembaruan SQL saya berdasarkan nama kolom yang sama (dalam kasus saya, saya perlu meningkatkan CaseID dengan 1.000.000:
Terakhir, aktifkan kembali integritas referensial dan aktifkan kembali kolom Identity pada kunci utama.
Catatan: Saya melihat beberapa orang menanyakan pertanyaan ini MENGAPA. Dalam kasus saya, saya harus menggabungkan data dari instance produksi kedua menjadi master DB sehingga saya bisa mematikan instance kedua. Saya hanya perlu semua data operasi PK / FK untuk tidak bertabrakan. Meta-data FK identik.
sumber