Kami memiliki tabel 5GB (hampir 500 juta baris) dan kami ingin menghapus properti identitas di salah satu kolom, tetapi ketika kami mencoba melakukan ini melalui SSMS - waktu habis.
Bisakah ini dilakukan melalui T-SQL?
sql
sql-server
tsql
Conrad Jagger
sumber
sumber
Jawaban:
Anda tidak dapat menghapus
IDENTITY
spesifikasi setelah disetel.Untuk menghapus seluruh kolom:
Informasi tentang ALTER TABLE di sini
Jika Anda perlu menyimpan data, tetapi menghapus
IDENTITY
kolomnya, Anda perlu:IDENTITY
kolom yang ada ke kolom baruIDENTITY
kolom yang ada .sumber
identity
kolom ini digunakan sebagai bagian dari aforeign key
di tabel lain, Anda harus menghapus pembatas terlebih dahulu, lalu mengambil tindakan seperti yang disebutkan @AdamWenger tentang penghapusan identitasattribute/property
.. Anda juga dapat melihat link ini untuk lebih jelasnya tentang menghapus atribut saja: blog.sqlauthority.com/2009/05/03/… ..Semoga berhasil!Jika Anda ingin melakukan ini tanpa menambah dan mengisi kolom baru , tanpa menyusun ulang kolom , dan hampir tidak ada waktu henti karena tidak ada data yang berubah pada tabel, mari lakukan keajaiban dengan fungsionalitas partisi (tetapi karena tidak ada partisi yang digunakan, Anda tidak akan melakukannya) t perlu edisi Enterprise):
ALTER TABLE [Original] SWITCH TO [Original2]
exec sys.sp_rename
untuk mengganti nama berbagai objek skema kembali ke nama aslinya, dan kemudian Anda dapat membuat ulang kunci asing Anda.Misalnya, diberikan:
Anda dapat melakukan hal berikut:
sumber
Ini menjadi berantakan dengan kendala kunci asing dan kunci utama, jadi inilah beberapa skrip untuk membantu Anda dalam perjalanan:
Pertama, buat kolom duplikat dengan nama sementara:
Selanjutnya, dapatkan nama batasan kunci utama Anda:
Sekarang coba lepaskan kendala kunci utama untuk kolom Anda:
Jika Anda memiliki kunci asing, itu akan gagal, jadi jika demikian jatuhkan batasan kunci asing. TERUS LACAK DARI TABEL YANG ANDA JALANKAN INI SEHINGGA ANDA DAPAT MENAMBAHKAN BATAS KEMBALI DI NANTI !!!
Setelah semua batasan kunci asing Anda dihapus, Anda akan dapat menghapus batasan PK, menghapus kolom itu, mengganti nama kolom temp Anda, dan menambahkan batasan PK ke kolom itu:
Terakhir, tambahkan kembali batasan FK:
El Fin!
sumber
Select t.name 'Table', i.name 'Index', c.name 'Column', i.is_primary_key, i.is_unique From sys.tables t Inner Join sys.indexes i On i.object_id = t.object_id Inner Join sys.index_columns ic ON ic.object_id = i.object_id And i.index_id = ic.index_id Inner Join sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id Where t.name = 'tableName' Order By t.name, i.name, i.index_id, ic.index_column_id
Saya baru saja mengalami masalah yang sama. 4 pernyataan di SSMS daripada menggunakan GUI dan itu sangat cepat.
Buat kolom baru
alter table users add newusernum int;
Salin nilai
update users set newusernum=usernum;
Jatuhkan kolom lama
alter table users drop column usernum;
Ubah nama kolom baru menjadi nama kolom lama
EXEC sp_RENAME 'users.newusernum' , 'usernum', 'COLUMN';
sumber
Skrip berikut menghapus bidang Identitas untuk kolom bernama 'Id'
Semoga membantu.
sumber
Kode di bawah berfungsi dengan baik, ketika kita tidak tahu nama kolom identitas .
Perlu menyalin data ke tabel temp baru seperti
Invoice_DELETED
. dan lain kali kami menggunakan:Untuk penjelasan lebih lanjut lihat: https://dba.stackexchange.com/a/138345/101038
sumber
Namun kode di atas hanya berfungsi jika tidak ada hubungan kunci asing-primer
sumber
Hanya untuk seseorang yang memiliki masalah yang sama dengan saya. Jika Anda hanya ingin membuat beberapa penyisipan sekali saja, Anda dapat melakukan sesuatu seperti ini.
Misalkan Anda memiliki tabel dengan dua kolom
dan ingin menyisipkan baris dengan ID = 4. Jadi Anda Ulangi ke 3 jadi yang berikutnya adalah 4
Buat Sisipan
Dan dapatkan seed Anda kembali ke ID tertinggi, misalkan adalah 15
Selesai!
sumber
Saya memiliki persyaratan yang sama, dan Anda dapat mencoba cara ini, yang secara pribadi saya rekomendasikan, desain tabel Anda secara manual dan buat skripnya, dan apa yang saya lakukan di bawah ini adalah mengganti nama tabel lama dan juga batasannya untuk cadangan.
sumber
Di SQL Server, Anda dapat mengaktifkan dan menonaktifkan penyisipan identitas seperti ini:
SET IDENTITY_INSERT table_name ON
- jalankan pertanyaan Anda di sini
NONAKTIFKAN nama_tabel IDENTITY_INSERT
sumber