Menggunakan MSSQL2005, bisakah saya memotong tabel dengan batasan kunci asing jika saya pertama memotong tabel anak (tabel dengan kunci utama hubungan FK)?
Saya tahu bahwa saya juga bisa
- Gunakan
DELETE
klausa tanpa tempat dan kemudianRESEED
identitas (atau) - Hapus FK, potong tabel, dan buat ulang FK.
Saya pikir selama saya memotong tabel anak sebelum orang tua, saya akan baik-baik saja tanpa melakukan salah satu opsi di atas, tapi saya mendapatkan kesalahan ini:
Tidak dapat memotong tabel 'TableName' karena sedang direferensikan oleh batasan KUNCI ASING.
sumber
Perhatikan bahwa ini mungkin bukan yang Anda inginkan jika Anda memiliki jutaan catatan, karena ini sangat lambat.
sumber
Karena
TRUNCATE TABLE
merupakan perintah DDL , itu tidak dapat memeriksa untuk melihat apakah catatan di tabel sedang direferensikan oleh catatan di tabel anak.Inilah sebabnya mengapa
DELETE
berhasil danTRUNCATE TABLE
tidak: karena database dapat memastikan bahwa itu tidak dirujuk oleh catatan lain.sumber
Tanpa
ALTER TABLE
Seperti Prosedur Yang Disimpan
https://github.com/reduardo7/TableTruncate
Perhatikan bahwa ini mungkin bukan yang Anda inginkan jika Anda memiliki jutaan catatan, karena ini sangat lambat.
sumber
Solusi @denver_citizen yang diberikan di atas tidak bekerja untuk saya, tapi saya suka semangatnya jadi saya memodifikasi beberapa hal:
Untuk kepentingan publik, berikut adalah skrip yang diperbarui:
sumber
gunakan perintah berikut setelah penghapusan semua baris dalam tabel itu dengan menggunakan pernyataan delete
EDIT: Sintaks terkoreksi untuk SQL Server
sumber
TRUNCATE
menghindari log dan jauh lebih cepat daripadaDELETE
tabel besar. Dengan demikian, ini bukan solusi setara sejati.Nah, karena saya tidak menemukan contoh dari yang sangat sederhana solusi yang saya digunakan, yaitu:
Ini dia:
1) Temukan nama kunci asing yang menyebabkan kegagalan (misalnya: FK_PROBLEM_REASON, dengan bidang
ID
, dari tabelTABLE_OWNING_CONSTRAINT
) 2) Hapus kunci itu dari tabel:3) Memotong tabel yang diinginkan
4) Tambahkan kembali kunci ke tabel pertama itu:
Itu dia.
sumber
Berikut adalah skrip yang saya tulis untuk mengotomatiskan proses. Saya harap ini membantu.
sumber
sys.foreign_keys
tabel. ( Referensi )Anda dapat mengikuti langkah ini, Dengan
reseeding table
Anda dapat menghapus data tabel.jika beberapa kesalahan terjadi maka Anda harus me-reseed tabel utama.
sumber
sumber
Jika saya mengerti dengan benar, apa yang ingin Anda lakukan adalah memiliki lingkungan yang bersih untuk diatur untuk DB yang melibatkan tes integrasi.
Pendekatan saya di sini adalah untuk membatalkan seluruh skema dan membuatnya kembali nanti.
Alasan:
sumber
Ditemukan di tempat lain di web
sumber
Anda tidak dapat memotong tabel jika Anda tidak menghilangkan kendala. Penonaktifan juga tidak berfungsi. Anda perlu Drop segalanya. Saya telah membuat skrip yang menghapus semua batasan lalu membuat ulang kemudian.
Pastikan untuk membungkusnya dalam transaksi;)
sumber
Jawaban @denver_citizen dan @Peter Szanto tidak cukup untuk saya, tetapi saya memodifikasinya untuk menjelaskan:
sumber
truncate tidak berfungsi untuk saya, hapus + reseed adalah jalan keluar terbaik. Jika ada beberapa dari Anda di luar sana yang perlu mengulangi sejumlah besar tabel untuk melakukan delete + reseed, Anda mungkin mengalami masalah dengan beberapa tabel yang tidak memiliki kolom identitas, kode berikut memeriksa apakah kolom identitas ada sebelum mencoba untuk diperbanyak
sumber
Saya menulis cara-cara berikut dan mencoba untuk membuat parameternya, sehingga Anda dapat menjalankannya dalam
Query document
atau Membuatnya bergunaSP
dengan mudah .A) Hapus
Jika tabel Anda tidak memiliki jutaan rekaman, ini berfungsi dengan baik dan tidak memiliki perintah Alter :
B) Potong
Jika tabel Anda memiliki jutaan catatan atau Anda tidak memiliki masalah dengan perintah Alter dalam kode Anda, maka gunakan yang ini:
sumber
Ini solusi saya untuk masalah ini. Saya menggunakannya untuk mengubah PK, tetapi gagasannya sama. Semoga ini bermanfaat)
sumber
Untuk
MS SQL
, setidaknya versi yang lebih baru, Anda bisa menonaktifkan batasan dengan kode seperti ini:sumber
Berikut ini berfungsi untuk saya bahkan dengan kendala FK, dan menggabungkan jawaban berikut untuk hanya menjatuhkan tabel yang ditentukan :
catatan:
Saya pikir ini masih membantu untuk mendeklarasikan tabel dalam urutan yang Anda ingin mereka hapus (yaitu membunuh dependensi terlebih dahulu). Seperti yang terlihat dalam jawaban ini , alih-alih mengulang nama tertentu, Anda dapat mengganti semua tabel dengan
sumber
DELETE
tidak sama denganTRUNCATE
. Ini akan mengisi log transaksi Anda.Jika tidak ada jawaban yang berfungsi seperti pada kasus saya, lakukan ini:
Semoga berhasil!
sumber
Hapus lalu setel ulang kenaikan otomatis:
kemudian
sumber
Satu-satunya cara adalah dengan menjatuhkan kunci asing sebelum melakukan pemotongan. Dan setelah memotong data, Anda harus membuat kembali indeks.
Script berikut menghasilkan SQL yang diperlukan untuk menjatuhkan semua batasan kunci asing.
Selanjutnya, skrip berikut menghasilkan SQL yang diperlukan untuk membuat kembali kunci asing.
Jalankan skrip yang dibuat untuk menjatuhkan semua kunci asing, memotong tabel, dan kemudian menjalankan skrip yang dihasilkan untuk membuat kembali semua kunci asing.
Pertanyaan diambil dari sini .
sumber
Di SSMS saya punya Diagram terbuka menunjukkan Kunci. Setelah menghapus Kunci dan memotong file saya menyegarkan kemudian fokus kembali pada Diagram dan membuat pembaruan dengan menghapus lalu mengembalikan kotak Identity. Menyimpan Diagram memunculkan kotak dialog Simpan, daripada kotak dialog "Perubahan dibuat dalam database saat Anda bekerja", mengklik Ya mengembalikan Kunci, mengembalikannya dari salinan yang terkunci di Diagram.
sumber
Jika Anda melakukan ini pada frekuensi apa pun, heck bahkan pada jadwal, saya pasti tidak akan pernah menggunakan pernyataan DML. Biaya penulisan untuk log transaksi hanya untuk tinggi, dan pengaturan seluruh database ke
SIMPLE
mode pemulihan untuk memotong satu tabel adalah konyol.Cara terbaik, sayangnya cara yang sulit atau melelahkan. Makhluk itu:
Proses saya untuk melakukan ini melibatkan langkah-langkah berikut:
Skrip seperti ini harus dilakukan dalam a
begin tran
dancommit tran
blok.sumber
Saya baru saja menemukan bahwa Anda dapat menggunakan tabel TRUNCATE pada tabel induk dengan batasan kunci asing pada anak selama Anda MENONAKTIFKAN kendala pada tabel anak terlebih dahulu. Misalnya
CONSTRAINT kunci asing child_par_ref di tabel anak, referensi PARENT_TABLE
sumber
Cara termudah:
1 - Masukkan di phpmyadmin
2 - Klik pada nama tabel di kolom kiri
3 - Klik di Operasi (menu atas)
4 - Klik "Kosongkan tabel (TRUNCATE)
5 - Nonaktifkan kotak" Aktifkan pemeriksaan kunci asing "
6 - Selesai !
Tautan ke tutorial gambar
Tutorial: http://www.imageno.com/wz6gv1wuqajrpic.html
(maaf, saya tidak punya cukup reputasi untuk mengunggah gambar di sini: P)
sumber
Anda bisa mencoba
DELETE FROM <your table >;
.Server akan menunjukkan kepada Anda nama batasan dan tabel, dan menghapus tabel itu Anda dapat menghapus apa yang Anda butuhkan.
sumber
referensi - memotong tabel dibatasi kunci asing
Bekerja untuk saya di MYSQL
sumber