web-dev-qa-db-fra.com

Désactivation des vérifications de clé étrangère sur la ligne de commande

J'ai un script de sauvegarde pour ma base de données MySQL, en utilisant mysqldump avec le --tab option pour produire un .sql fichier pour la structure et un .txt fichier (séparé par des tuyaux) pour le contenu.

Certaines tables ont des clés étrangères, donc quand je les importe, j'obtiens l'erreur:

ERREUR 1217 (23000) à la ligne 8: impossible de supprimer ou de mettre à jour une ligne parent: une contrainte de clé étrangère échoue

Je sais utiliser SET FOREIGN_KEY_CHECKS=0 (et SET FOREIGN_KEY_CHECKS=1 après). Si j'en ajoute à chaque .sql fichier puis l'importation fonctionne. Mais alors, évidemment, les mysqldump suivants seront écrasés.

J'ai également essayé de l'exécuter en tant que commande distincte, comme ci-dessous, mais l'erreur revient:

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

Existe-t-il un autre moyen de désactiver les vérifications FK sur la ligne de commande?

46
DisgruntledGoat

Vous pouvez le faire en concaténant la chaîne au fichier en ligne. Je suis sûr qu'il existe un moyen plus simple de concaténer des chaînes et des fichiers, mais cela fonctionne.

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

Je ne pense pas que vous ayez besoin de le remettre à 1 car il ne s'agit que d'une seule session.

69
Explosion Pills

Vous pouvez aussi utiliser --init-command paramètre de la commande mysql.

C'est à dire.: mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...

Documentation MySQL 5.5 - options mysql

87
Wiktor

Juste un autre pour faire de même:

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

Connectez-vous à la ligne de commande mysql:

mysql -u <username> -p -h <Host_name or ip> Puis exécutez

1 SET FOREIGN_KEY_CHECKS=0;

2 SOURCE /pathToFile/backup.sql;

3 SET FOREIGN_KEY_CHECKS=1;

9
deepak