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:
246
Es ist sitzungsbasiert, wenn Sie festlegen, wie Sie es in Ihrer Frage getan haben.
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.
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.
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.
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
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
Antworten:
Es ist sitzungsbasiert, wenn Sie festlegen, wie Sie es in Ihrer Frage getan haben.
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
Demnach
FOREIGN_KEY_CHECKS
ist "Beide" für den Umfang. Dies bedeutet, dass es für die Sitzung eingestellt werden kann:oder global:
quelle
Tatsächlich gibt es zwei
foreign_key_checks
Variablen: 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_checks
oder, um die globale Variable zu ändernSET @@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
quelle
foreign_key_checks
und in derselben Sitzung erwarten, dass Fremdschlüsseleinschränkungen ignoriert werden. Sie müssen die nicht globale Variable festlegen.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.
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.
quelle
Wenn Sie nicht GLOBAL eingestellt haben, war nur Ihre Sitzung betroffen.
quelle
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
Ändern von my.ini unter C: \ xampp \ mysql \ bin \ my.ini
quelle
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.17quelle