Apakah MySQL foreign_key_checks memengaruhi seluruh database?

201

Ketika saya menjalankan perintah ini di MySQL:

SET FOREIGN_KEY_CHECKS=0;

Apakah itu memengaruhi seluruh mesin atau hanya transaksi saya saat ini?

Sean Nguyen
sumber
15
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:

98

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.

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

Ron Inbar
sumber
1
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.

Bouke Versteegh
sumber
1
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.

Mike Karras
sumber
1

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

max_execution_time = 600
max_input_time = 600
memory_limit = 1024M
post_max_size = 1024M

Mengubah my.ini di C: \ xampp \ mysql \ bin \ my.ini

max_allowed_packet = 1024M
Saeed cr7
sumber
-2

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

pengguna2682955
sumber