test: masuk ke mysql: tampilkan variabel seperti '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; Setelah itu login ke mysql menggunakan konsol yang berbeda. Saya dapat melihat bahwa variabel acara seperti '% ASING%' adalah AKTIF alih-alih MATI.
Sean Nguyen
Jawaban:
246
Ini berbasis sesi, ketika mengatur cara Anda melakukannya dalam pertanyaan Anda.
Sebenarnya, ada dua foreign_key_checksvariabel: variabel global dan variabel lokal (per sesi). Setelah koneksi, variabel sesi diinisialisasi ke nilai variabel global.
Perintah SET foreign_key_checksmemodifikasi variabel sesi.
Untuk memodifikasi variabel global, gunakan SET GLOBAL foreign_key_checksatau SET @@global.foreign_key_checks.
Apakah pengaturan foreign_key_checks pada setiap permintaan mahal? Saya punya skrip untuk memutakhirkan DB dan saya tidak ingin orang lain dapat menimpa pemeriksaan kunci asing secara default selama pemutakhiran itu. Jadi saya akan membuat jutaan pertanyaan dan saya bertanya-tanya apakah SET akan signifikan atau tidak?
Aki
@ Aki Jika Anda meningkatkan DB, saya akan mengatakan Anda lebih baik mengunci akses untuk semua orang. Setidaknya untuk menulis. Jika tidak, Anda dapat mengharapkan semua jenis masalah akses bersamaan.
tishma
1
Jawaban dan perbedaan yang bagus. Penting untuk menyadari konsekuensi dari cara kerjanya. Ini berarti bahwa Anda tidak dapat mengatur GLOBAL foreign_key_checksdan dalam sesi yang sama mengharapkannya untuk mengabaikan batasan kunci asing. Anda perlu mengatur variabel non-global.
Tyler Collier
12
Seperti yang dijelaskan oleh Ron, ada dua variabel, lokal dan global. Variabel lokal selalu digunakan, dan sama dengan global saat koneksi.
SET FOREIGN_KEY_CHECKS=0;SET GLOBAL FOREIGN_KEY_CHECKS=0;
SHOW Variables WHERE Variable_name='foreign_key_checks';# always shows local variable
Saat mengatur variabel GLOBAL, yang lokal tidak berubah untuk koneksi yang ada. Anda perlu menyambung kembali atau mengatur variabel lokal juga.
Mungkin tidak intuitif, MYSQL tidak memberlakukan kunci asing ketika FOREIGN_KEY_CHECKS diaktifkan kembali. Ini memungkinkan untuk membuat database yang tidak konsisten meskipun kunci asing dan cek aktif.
Jika Anda ingin kunci asing Anda sepenuhnya konsisten, Anda perlu menambahkan kunci saat memeriksa aktif.
Bisakah Anda menguraikan .... "Jika Anda ingin kunci asing Anda sepenuhnya konsisten, Anda perlu menambahkan kunci saat memeriksa aktif."
user2782001
4
Katakanlah Anda memiliki tabel dengan id referensi, tetapi beberapa catatan referensi tidak ada. Jika Anda menambahkan kunci asing (FK) ketika FOREIGN_KEY_CHECKS AKTIF, maka Mysql akan meningkatkan kesalahan dan menolak untuk menambahkan FK, karena referensi yang rusak. Ketika Anda menambahkan kunci asing saat FOREIGN_KEY_CHECKS MATI, mysql berlanjut tanpa kesalahan. Bahkan ketika Anda mengaktifkan pemeriksaan setelahnya, tidak akan ada kesalahan. Anda sekarang memiliki tabel dengan data yang tidak konsisten, meskipun ada FK. Dengan demikian, keberadaan FK bukan jaminan konsistensi basis data, kecuali jika ditambahkan saat pemeriksaan FK aktif.
Bouke Versteegh
10
# will get you the current local (session based) state.
SHOW Variables WHERE Variable_name='foreign_key_checks';
Jika Anda tidak SET GLOBAL, hanya sesi Anda yang terpengaruh.
Saya memiliki kesalahan yang sama ketika saya mencoba untuk memigrasi database Drupal ke server apache lokal baru (saya menggunakan XAMPP pada mesin Windows). Sebenarnya saya tidak tahu arti dari kesalahan ini, tetapi setelah mencoba langkah-langkah di bawah ini, saya mengimpor database tanpa kesalahan. Semoga ini bisa membantu:
Dalam hal menggunakan browser permintaan Mysql, SET FOREIGN_KEY_CHECKS=0;tidak memiliki dampak apa pun di versi 1.1.20. Namun, itu berfungsi dengan baik di browser permintaan Mysql 1.2.17
Jawaban:
Ini berbasis sesi, ketika mengatur cara Anda melakukannya dalam pertanyaan Anda.
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
Menurut ini,
FOREIGN_KEY_CHECKS
adalah "Keduanya" untuk ruang lingkup. Ini berarti dapat diatur untuk sesi:atau secara global:
sumber
Sebenarnya, ada dua
foreign_key_checks
variabel: variabel global dan variabel lokal (per sesi). Setelah koneksi, variabel sesi diinisialisasi ke nilai variabel global.Perintah
SET foreign_key_checks
memodifikasi variabel sesi.Untuk memodifikasi variabel global, gunakan
SET GLOBAL foreign_key_checks
atauSET @@global.foreign_key_checks
.Lihat bagian manual berikut ini:
http://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -system-variable.html
sumber
foreign_key_checks
dan dalam sesi yang sama mengharapkannya untuk mengabaikan batasan kunci asing. Anda perlu mengatur variabel non-global.Seperti yang dijelaskan oleh Ron, ada dua variabel, lokal dan global. Variabel lokal selalu digunakan, dan sama dengan global saat koneksi.
Saat mengatur variabel GLOBAL, yang lokal tidak berubah untuk koneksi yang ada. Anda perlu menyambung kembali atau mengatur variabel lokal juga.
Mungkin tidak intuitif, MYSQL tidak memberlakukan kunci asing ketika FOREIGN_KEY_CHECKS diaktifkan kembali. Ini memungkinkan untuk membuat database yang tidak konsisten meskipun kunci asing dan cek aktif.
Jika Anda ingin kunci asing Anda sepenuhnya konsisten, Anda perlu menambahkan kunci saat memeriksa aktif.
sumber
Jika Anda tidak SET GLOBAL, hanya sesi Anda yang terpengaruh.
sumber
Saya memiliki kesalahan yang sama ketika saya mencoba untuk memigrasi database Drupal ke server apache lokal baru (saya menggunakan XAMPP pada mesin Windows). Sebenarnya saya tidak tahu arti dari kesalahan ini, tetapi setelah mencoba langkah-langkah di bawah ini, saya mengimpor database tanpa kesalahan. Semoga ini bisa membantu:
Mengubah php.ini di C: \ xampp \ php \ php.ini
Mengubah my.ini di C: \ xampp \ mysql \ bin \ my.ini
sumber
Dalam hal menggunakan browser permintaan Mysql,
SET FOREIGN_KEY_CHECKS=0;
tidak memiliki dampak apa pun di versi 1.1.20. Namun, itu berfungsi dengan baik di browser permintaan Mysql 1.2.17sumber