2013-04-11 15 views
32

Ho uno script di backup per il mio database MySQL, utilizzando mysqldump con l'opzione --tab quindi produce un file .sql per la struttura e un file .txt (pipe-separato) per il contenuto.Disabilitazione dei controlli di chiave esterna sulla riga di comando

Alcune tabelle hanno chiavi esterne, così quando ho importarlo sto ottenendo l'errore:

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

So sull'utilizzo SET FOREIGN_KEY_CHECKS=0 (e SET FOREIGN_KEY_CHECKS=1 in seguito). Se aggiungo quelli a ciascun file .sql, l'importazione funziona. Ma poi ovviamente sul prossimo mysqldump quelli vengono sovrascritti.

Ho anche provato a fare funzionare come un comando separato, come qui di seguito ma l'errore ritorna:

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

C'è qualche altro modo per disattivare i controlli FK sulla riga di comando?

risposta

56

È possibile farlo concatenando la stringa al file in linea. Sono sicuro che esiste un modo più semplice per concatenare stringhe e file, ma funziona.

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

Non penso che sia necessario riportarlo su 1 poiché è solo una sessione.

+0

questo sembra il modo migliore. È sorprendente che 'mysqldump' non abbia un'opzione' --disable-foreign-keys'. – Barmar

+2

@Barmar ricorda che le chiavi esterne sono un prodotto del motore InnoDB piuttosto che lo stesso MySQL –

+0

Grazie, funziona! Quindi l'impostazione dei controlli FK funziona solo per un comando, invece di persistere su più comandi? – DisgruntledGoat

12

Solo un altro uno a fare lo stesso:

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

Grazie, questo era perfetto dato che stavo 'zcat'ing il mio altro file. –

43

È anche possibile utilizzare --init-command parametro del mysql comando.

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

MySQL 5.5 Documentation - mysql options

+3

Questa è la soluzione migliore, migliore della risposta di "Explosion Pills" – chris342423

+0

ho provato ad esempio: mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0;" -u root -p DBname e ricevo un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0;" -u root -p DBName 'alla riga 1 –

Problemi correlati