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?
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.
Vous pouvez aussi utiliser --init-command
paramètre de la commande mysql
.
C'est à dire.: mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...
Juste un autre pour faire de même:
{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql
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;