-
Sebenarnya cara menghapus data di database tidak ribet. Kenapa harus repot? Pertama, yang saya perkenalkan di sini adalah menghapus semua data di database. Karena data bisa saling membatasi, operasi penghapusannya boleh saja jatuh ke dalam lingkaran tak terbatas. Sebenarnya cara menghapus data di database tidak rumit. Mengapa saya harus repot? Pertama, yang saya perkenalkan di sini adalah menghapus semua data di database. Karena data dapat membentuk batasan bersama, operasi penghapusan mungkin jatuh ke dalam loop tak terbatas. Kedua, prosedur tersimpan sp_MSForEachTable tidak resmi dari Microsoft digunakan di sini.
Mungkin banyak pembaca dan teman-teman yang pernah mengalami hal seperti ini: mereka ingin membersihkan database yang kosong berdasarkan database pengembangan, namun karena kurangnya pemahaman secara keseluruhan tentang struktur database, ketika menghapus record dalam sebuah tabel, mereka tidak dapat menghapusnya. karena mungkin ada batasan kunci asing. Struktur database yang umum adalah tabel utama dan subtabel. Dalam hal ini, Anda biasanya harus menghapus catatan sub-tabel terlebih dahulu, dan kemudian menghapus catatan tabel utama.
Saat menghapus catatan data, pernyataan delete dan truncate sering terlintas dalam pikiran. Namun, jika ada batasan antara dua tabel atau lebih, kedua pernyataan ini mungkin gagal, dan hal yang paling buruk adalah kedua perintah ini hanya dapat dioperasikan satu meja pada satu waktu. Jadi apa yang harus Anda lakukan ketika Anda benar-benar ingin menghapus semua catatan di database SQL Server?
1. Menghapus satu per satu secara berurutan. Cara ini sangat tidak realistis jika tabelnya banyak. Sekalipun tabelnya tidak banyak tetapi banyak kendalanya, Anda tetap harus menghabiskan banyak waktu dan tenaga untuk mempelajari kendala tersebut. hubungan. Kemudian cari tahu tabel mana yang harus dihapus terlebih dahulu, tabel mana yang harus dihapus berikutnya, dan tabel mana yang harus dihapus terakhir kali.
2. Nonaktifkan semua batasan, hapus semua data, dan terakhir aktifkan batasan. Dengan cara ini Anda tidak perlu menghabiskan waktu dan tenaga untuk mempelajari batasan. Anda hanya perlu menulis prosedur tersimpan sederhana untuk menyelesaikan tugas ini secara otomatis.
Dari kedua pilihan tersebut, tidak sulit untuk melihat bahwa pilihan kedua adalah yang paling sederhana dan efektif.
Pertama, Anda harus menulis kode untuk mengulang semua tabel. Di sini saya merekomendasikan prosedur tersimpan sp_MSForEachTable, karena tidak ada deskripsi prosedur tersimpan ini dalam dokumentasi resmi Microsoft, dan banyak pengembang mungkin belum pernah mendengarnya, sehingga Anda dapat mencarinya. di Internet. Sebagian besar solusinya sangat rumit. Beberapa orang mungkin berpikir bahwa karena tidak ada dokumen resmi, proses penyimpanan ini mungkin tidak stabil, dan mereka secara psikologis akan menolaknya, namun kenyataannya tidak demikian. Mari kita lihat skrip lengkapnya:
BUAT PROSEDUR sp_DeleteAllData
SEBAGAI
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT SEMUA'
EXEC sp_MSForEachTable 'ALTER TABLE? NONAKTIFKAN PEMICU SEMUA'
EXEC sp_MSForEachTable 'HAPUS DARI?'
EXEC sp_MSForEachTable 'ALTER TABLE? PERIKSA KONSTRAINT SEMUA'
EXEC sp_MSForEachTable 'ALTER TABLE? AKTIFKAN PEMICU SEMUA'
EXEC sp_MSFOREACHTABLE 'PILIH * DARI ?'
PERGI
Skrip ini membuat prosedur tersimpan bernama sp_DeleteAllData. Dua pernyataan pertama menonaktifkan batasan dan pemicu masing-masing. Pernyataan ketiga sebenarnya menghapus semua data. Pernyataan berikut masing-masing memulihkan batasan dan pemicu. pernyataan ini dapat dihilangkan. Saya hanya ingin memastikan apakah semua tabel telah dibersihkan.
Anda dapat menjalankan prosedur tersimpan ini di database mana pun, tentu saja tidak di database yang dihasilkan, tapi jangan salahkan saya karena tidak memberi tahu Anda! Bagaimanapun, buat cadangan database terlebih dahulu, gunakan database cadangan untuk memulihkan, lalu jalankan prosedur tersimpan , haha, meskipun databasenya besar. Tidak butuh waktu lama untuk database Anda menjadi database kosong, yang agak menakutkan!