Betrifft MySQL Foreign_key_checks die gesamte Datenbank?


201

Wenn ich diesen Befehl in MySQL ausführe:

SET FOREIGN_KEY_CHECKS=0;

Betrifft es die gesamte Engine oder ist es nur meine aktuelle Transaktion?


15
test: logge dich in mysql ein: zeige Variablen wie '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; Danach melden Sie sich mit einer anderen Konsole bei MySQL an. Ich kann sehen, dass Showvariablen wie '% FOREIGN%' EIN statt AUS sind.
Sean Nguyen

Antworten:



98

Tatsächlich gibt es zwei foreign_key_checksVariablen: eine globale Variable und eine lokale Variable (pro Sitzung). Bei der Verbindung wird die Sitzungsvariable mit dem Wert der globalen Variablen initialisiert.
Der Befehl SET foreign_key_checksändert die Sitzungsvariable.
Verwenden Sie SET GLOBAL foreign_key_checksoder, um die globale Variable zu ändern SET @@global.foreign_key_checks.

Konsultieren Sie die folgenden Abschnitte des Handbuchs:
http://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -system-variables.html


1
Ist das Festlegen der Foreign_key_checks für jede Anforderung teuer? Ich habe ein Skript zum Aktualisieren der Datenbank und möchte nicht, dass andere Benutzer die Fremdschlüsselprüfungen während dieses Upgrades standardmäßig überschreiben können. Also habe ich Millionen von Anfragen gestellt und mich gefragt, ob ein SET von Bedeutung ist oder nicht.
Aki

@Aki Wenn Sie die Datenbank aktualisieren, ist es besser, den Zugriff für alle anderen zu sperren. Zumindest zum Schreiben. Andernfalls können Sie alle Arten von gleichzeitigen Zugriffsproblemen erwarten.
Tishma

1
Tolle Antwort und Unterscheidung. Es ist wichtig, die Konsequenzen seiner Funktionsweise zu erkennen. Dies bedeutet, dass Sie GLOBAL nicht festlegen können foreign_key_checksund in derselben Sitzung erwarten, dass Fremdschlüsseleinschränkungen ignoriert werden. Sie müssen die nicht globale Variable festlegen.
Tyler Collier

12

Wie von Ron erklärt, gibt es zwei Variablen, lokal und global. Die lokale Variable wird immer verwendet und ist bei der Verbindung dieselbe wie global.

SET FOREIGN_KEY_CHECKS=0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

SHOW Variables WHERE Variable_name='foreign_key_checks'; # always shows local variable

Beim Festlegen der GLOBAL-Variablen wird die lokale Variable für vorhandene Verbindungen nicht geändert. Sie müssen die lokale Variable erneut verbinden oder festlegen.

Möglicherweise nicht intuitiv, erzwingt MYSQL keine Fremdschlüssel, wenn FOREIGN_KEY_CHECKS wieder aktiviert wird. Auf diese Weise kann eine inkonsistente Datenbank erstellt werden, obwohl Fremdschlüssel und Überprüfungen aktiviert sind.

Wenn Ihre Fremdschlüssel vollständig konsistent sein sollen, müssen Sie die Schlüssel hinzufügen, während die Überprüfung aktiviert ist.


1
Können Sie näher darauf eingehen? "Wenn Ihre Fremdschlüssel vollständig konsistent sein sollen, müssen Sie die Schlüssel hinzufügen, während die Überprüfung aktiviert ist."
user2782001

4
Angenommen, Sie haben eine Tabelle mit referenzierenden IDs, aber einige referenzierte Datensätze fehlen. Wenn Sie den Fremdschlüssel (FK) hinzufügen, während FOREIGN_KEY_CHECKS eingeschaltet ist, gibt MySQL einen Fehler aus und lehnt das Hinzufügen des FK aufgrund der fehlerhaften Referenz ab. Wenn Sie den Fremdschlüssel hinzufügen, während FOREIGN_KEY_CHECKS ausgeschaltet ist, wird MySQL ohne Fehler fortgesetzt. Auch wenn Sie die Überprüfungen anschließend aktivieren, tritt kein Fehler auf. Sie haben jetzt eine Tabelle mit inkonsistenten Daten, obwohl es eine FK gibt. Daher ist das Vorhandensein eines FK keine Garantie für die Datenbankkonsistenz, es sei denn, es wurde hinzugefügt, während die FK-Prüfungen aktiviert waren.
Bouke Versteegh

10
# will get you the current local (session based) state.
SHOW Variables WHERE Variable_name='foreign_key_checks';

Wenn Sie nicht GLOBAL eingestellt haben, war nur Ihre Sitzung betroffen.


1

Ich hatte den gleichen Fehler, als ich versuchte, die Drupal-Datenbank auf einen neuen lokalen Apache-Server zu migrieren (ich verwende XAMPP auf einem Windows-Computer). Eigentlich kenne ich die Bedeutung dieses Fehlers nicht, aber nachdem ich die folgenden Schritte ausgeführt habe, habe ich die Datenbank ohne Fehler importiert. Hoffe das könnte helfen:

Ändern der php.ini unter C: \ xampp \ php \ php.ini

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

Ändern von my.ini unter C: \ xampp \ mysql \ bin \ my.ini

max_allowed_packet = 1024M

-2

Bei Verwendung des MySQL-Abfragebrowsers SET FOREIGN_KEY_CHECKS=0;hat dies keine Auswirkungen auf Version 1.1.20. Es funktioniert jedoch einwandfrei mit dem MySQL-Abfragebrowser 1.2.17

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.