2013-04-11 17 views
32

Mam skrypt kopii zapasowej dla mojej bazy danych MySQL, używając mysqldump z opcją --tab więc tworzy plik .sql dla struktury i .txt plik (rura rozdzielone) dla treści.Wyłączenie klucz obcy kontrole linii poleceń

Niektóre tabele mają klucze obce, więc kiedy zaimportować go dostaję błąd:

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

wiem o użyciu SET FOREIGN_KEY_CHECKS=0 (i SET FOREIGN_KEY_CHECKS=1 później). Jeśli dodaję je do każdego pliku .sql, import działa. Ale oczywiście na następnym mysqldump te zostaną nadpisane.

Próbowałem też uruchomić go jako oddzielny polecenia, jak poniżej ale błąd wraca:

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

Czy istnieje jakiś inny sposób, aby wyłączyć sprawdzanie FK w wierszu polecenia?

Odpowiedz

56

Możesz to zrobić, łącząc ciąg do pliku w linii. Jestem pewien, że istnieje łatwiejszy sposób łączenia łańcuchów i plików, ale działa.

cat <(echo "SET FOREIGN_KEY_CHECKS=0;") imports.sql | mysql 

Nie sądzę, że trzeba ustawić go z powrotem na 1, ponieważ jest to tylko jedna sesja.

+0

wygląda to jak najlepszy sposób. Zaskakujące jest, że 'mysqldump' nie ma opcji' --disable-foreign-keys'. – Barmar

+2

@Barmar pamiętać, że klucze obce są produktem silnika InnoDB, a nie samym MySQL –

+0

Dzięki, to działa! Czy ustawienie kontroli FK działa tylko dla jednego polecenia, a nie dla wielu poleceń? – DisgruntledGoat

12

Just another one do tego samego:

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

Dzięki, to było idealne, ponieważ byłem "Zcat" w moim drugim pliku. –

43

Można również użyć --init-command parametr polecenia mysql.

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

MySQL 5.5 Documentation - mysql options

+3

To jest najlepsze rozwiązanie, lepsze niż odpowiedź "Pigułki wybuchowe" – chris342423

+0

Próbowałem jak: mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0;" -u root -p Nazwa bazy danych i otrzymujesz błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu 'mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0;" -u root -p nazwa_bazy_danych 'w linii 1 –