2013-04-11 8 views
32

Ich habe einen Backup-Skript für meine MySQL-Datenbank, mit mysqldump mit der --tab Option, so dass es eine .sql-Datei für die Struktur und eine .txt Datei (Rohr-getrennt) für den Inhalt erzeugt.Deaktivieren Fremdschlüsselprüfungen auf der Kommandozeile

Einige Tabellen Fremdschlüssel haben, so dass, wenn ich es importieren Ich erhalte die Fehlermeldung:

ERROR 1217 (23000) at line 8: Cannot delete or update a parent row: a foreign key constraint fails

ich weiß, mit SET FOREIGN_KEY_CHECKS=0 (und SET FOREIGN_KEY_CHECKS=1 später). Wenn ich diese zu jeder .sql Datei hinzufüge, dann funktioniert der Import. Aber dann offensichtlich auf die nächsten mysqldump diejenigen überschrieben werden.

ich es als separater Befehl ausgeführt wird, auch versucht, unten wie aber der Fehler kommt zurück:

echo "SET FOREIGN_KEY_CHECKS=0" | mysql [user/pass/database] 
[all the imports] 
echo "SET FOREIGN_KEY_CHECKS=1" | mysql [user/pass/database] 

Gibt es eine andere Möglichkeit FK Kontrollen auf der Kommandozeile zu deaktivieren?

Antwort

56

Sie können dies tun, indem Sie die Zeichenfolge an die Datei inline verketten. Ich bin mir sicher, dass es einen einfacheren Weg gibt, Strings und Dateien zu verketten, aber es funktioniert.

Ich denke nicht, dass Sie es auf 1 zurückstellen müssen, da es nur eine Sitzung ist.

+0

Dies sieht aus wie der beste Weg. Es ist überraschend, dass mysqldump keine Option "--disable-foreign-keys" hat. – Barmar

+2

@Barmar erinnern, dass Fremdschlüssel ein Produkt der InnoDB-Engine sind, anstatt MySQL selbst –

+0

Danke, das funktioniert! Das Setzen von FK-Checks funktioniert also nur für einen Befehl, anstatt über mehrere Befehle hinweg zu bestehen? – DisgruntledGoat

12

nur ein weiteres dasselbe zu tun:

{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql 
+0

Danke, das war perfekt, seit ich 'zcat' meine andere Datei war. –

43

Sie auch --init-command Parameter mysql Befehl verwenden können.

d.h .: mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...

MySQL 5.5 Documentation - mysql options

+3

Dies ist die beste Lösung, besser als die Antwort von "Explosion Pillen" – chris342423

+0

ich versuchte wie: mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0;" -u root -p DBname und ich bekomme Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, für die richtige Syntax, die Sie in der Nähe von 'mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0;" -u root -p DBName 'in Zeile 1 –