Apakah mungkin untuk menonaktifkan sementara kendala di MySQL?
Saya memiliki dua model Django, masing-masing dengan ForeignKey yang lain. Menghapus instance dari model akan mengembalikan kesalahan karena batasan ForeignKey:
cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed() #a foreign key constraint fails here
cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()
Apakah mungkin untuk menonaktifkan sementara kendala dan menghapus pula?
ON DELETE SET NULL
? Itu akan mencapai hal yang serupa dan Anda tidak perlu menghidupkan dan mematikan kunci.Jawaban:
Coba
DISABLE KEYS
ataupastikan untuk
setelah.
sumber
disable keys
untuk InnodbUntuk mematikan batasan kunci asing secara global, lakukan hal berikut:
dan ingat untuk mengaturnya kembali ketika Anda selesai
PERINGATAN: Anda hanya harus melakukan ini ketika Anda melakukan pemeliharaan mode satu pengguna. Karena mungkin mengakibatkan inkonsistensi data. Sebagai contoh, akan sangat membantu ketika Anda mengunggah sejumlah besar data menggunakan output mysqldump.
sumber
SET FOREIGN_KEY_CHECKS
saja mengubah nilai untuk koneksi saat ini , sementaraSET GLOBAL ..
mengubah nilai untuk semua koneksi , termasuk koneksi di masa depan. Jika Anda hanya melakukannyaSET FOREIGN..
di satu jendela, kemudian mencoba menerapkan pernyataan di jendela yang berbeda (melalui koneksi yang berbeda), nilainya tidak berubah di sana. DenganGLOBAL
, variabel yang sama memiliki nilai yang sama untuk kedua koneksi.ERROR 1228 (HY000): Variable 'foreign_key_checks' is a SESSION variable and can't be used with SET GLOBAL
Saya biasanya hanya menonaktifkan batasan kunci asing ketika saya ingin memotong tabel, dan karena saya terus kembali ke jawaban ini, ini untuk saya di masa depan:
sumber
Alih-alih menonaktifkan kendala Anda, ubah secara permanen ke ON DELETE SET NULL. Itu akan mencapai hal yang serupa dan Anda tidak perlu menghidupkan dan mematikan kunci. Seperti itu:
Baca ini ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html ) dan ini ( http://dev.mysql.com/doc/refman/5.5/en /create-table-foreign-keys.html ).
sumber
FOREIGN_KEY_CHECKS
ke 0 dan mengembalikannya setelah pekerjaan kotor selesai. Selain itu mungkin mengunci untuk menulis tabel Anda.Untuk mematikan batasan kunci asing secara global:
dan untuk batasan kunci asing aktif
sumber
Solusi yang sangat sederhana dengan phpmyadmin:
sumber
SET FOREIGN_KEY_CHECKS=0; ..... SET FOREIGN_KEY_CHECKS=1;
tidak berfungsi untuk saya di PHPMyAdmin karena saya lupa menghapus centang pada kotak centang 'Aktifkan pemeriksaan kunci asing'. Di PHPMyAdmin Anda dapat melewati perintah SET ini dan hapus centang pada kotak centang.Bagi saya
SET FOREIGN_KEY_CHECKS=0;
itu tidak cukup. Saya masih memilikicom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
.Saya harus menambahkan
ALTER TABLE myTable DISABLE KEYS;
.Begitu:
sumber
Jika bidang kunci nullable, maka Anda juga dapat mengatur nilai menjadi nol sebelum mencoba menghapusnya:
sumber
Di phpMyAdmin Anda dapat memilih beberapa baris lalu klik tindakan hapus. Anda akan memasuki layar yang mencantumkan permintaan penghapusan, Anda dapat menghapus centang pada pemeriksaan kunci Asing, dan klik Ya untuk menjalankannya.
Ini akan memungkinkan Anda untuk menghapus baris bahkan jika ada batasan pembatasan ON DELETE.
sumber
Ini bukan ide yang baik untuk menetapkan batasan kunci asing ke 0, karena jika Anda melakukannya, database Anda tidak akan memastikan itu tidak melanggar integritas referensial. Ini dapat menyebabkan data tidak akurat, menyesatkan, atau tidak lengkap.
Anda membuat kunci asing karena suatu alasan: karena semua nilai dalam kolom anak harus sama dengan nilai di kolom induk. Jika tidak ada batasan kunci asing, baris anak dapat memiliki nilai yang tidak ada di baris induk, yang akan menyebabkan data tidak akurat.
Misalnya, katakanlah Anda memiliki situs web untuk siswa masuk dan setiap siswa harus mendaftar untuk akun sebagai pengguna. Anda memiliki satu tabel untuk id pengguna, dengan id pengguna sebagai kunci utama; dan tabel lain untuk akun siswa, dengan id siswa sebagai kolom. Karena setiap siswa harus memiliki id pengguna, masuk akal untuk membuat id siswa dari tabel akun siswa kunci asing yang merujuk id pengguna kunci utama di tabel id pengguna. Jika tidak ada pemeriksaan kunci asing, siswa dapat memiliki ID siswa dan ID pengguna, yang berarti siswa dapat memperoleh akun tanpa menjadi pengguna, yang salah.
Bayangkan jika itu terjadi pada sejumlah besar data. Itu sebabnya Anda memerlukan pemeriksaan kunci asing.
Yang terbaik adalah mencari tahu apa yang menyebabkan kesalahan. Kemungkinan besar, Anda mencoba untuk menghapus dari baris induk tanpa menghapus dari baris anak. Coba hapus dari baris anak sebelum menghapus dari baris induk.
sumber