Pouvez-vous créer automatiquement un fichier mysqldump qui n'applique pas les contraintes de clé étrangère?

StackOverflow https://stackoverflow.com/questions/2429655

Question

Lorsque j'exécute une commande mysqldump sur ma base de données, puis j'essaie de l'importer, elle échoue car elle tente de créer les tableaux de manière alphabétique, même s'ils peuvent avoir une clé étrangère qui fait référence à un tableau plus tard dans le fichier. Il ne semble pas y avoir rien dans le Documentation Et j'ai trouvé des réponses comme cette qui dit pour mettre à jour le fichier après avoir créé pour inclure:

set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;

N'y a-t-il aucun moyen de définir automatiquement ces lignes ou d'exporter les tables dans l'ordre nécessaire (sans avoir à spécifier manuellement tous les noms de table car cela peut être fastidieux et sujet aux erreurs)? Je pouvais envelopper ces lignes dans un script, mais je me demandais s'il existe un moyen facile de m'assurer que je peux vider un fichier, puis l'importer sans le mettre à jour manuellement.

Était-ce utile?

La solution

La mysqldump Commande incluse avec MySQL depuis la version 4.1.1 Par défaut, produit un script qui désactive les vérifications de la clé étrangère. La ligne suivante est incluse en haut du fichier de vidage:

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

La /*!40014 ... */ La syntaxe est un commentaire conditionnel qui sera exécuté sur MySQL version 4.0.14 et plus tard. L'ancien paramètre de vérification des touches étrangères est restaurée vers la fin du fichier de vidage:

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

Notez que les commentaires conditionnels sont interprété par le client (plutôt que le serveur). Si vous chargez le fichier de vidage avec un client qui ne les prend pas en charge, les vérifications de la clé étrangère ne seront pas désactivées et vous pourriez rencontrer des erreurs. Pour les meilleurs résultats, je suggère de charger des fichiers de vidage à l'aide du client officiel de la ligne de commande MySQL:

mysql -hserver -uuser -p database < dumpfile.sql

Il convient également de noter que si mysqldump est exécuté avec le --compact Option, puis les commandes pour désactiver et réactiver les vérifications de la clé étrangère sont omises du fichier de vidage.

Autres conseils

Il faut se méfier. Pour une raison quelconque, MySQLDump n'écrit pas le Foreign_Key_Checks = 0 Si l'option - compacte est utilisée.

Ciao.

Si vous utilisez phpmyadmin lors de l'exportation de SQL, choisissez Méthode d'exportation personnalisée. Ensuite, parmi les options de case, cliquez sur "Désactiver les vérifications des clés étrangères". L'instruction SQL exportée aura respectivement les vérifications de la clé étrangère désactivées et activeront respectivement le début et la fin du fichier de sortie.

Ce n'est pas "automatique", mais vous n'aurez pas à écrire les déclarations vous-même pour chaque exportation.

Cela peut arriver si vous utilisez --compact comme l'un de vos mysqldump commande.--compact comprend --skip-comments donc au lieu --compact il faut utiliser --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

Méfiez-vous de votre client MySQL que vous utilisez, avec le mysql Commande, pas de problème. Dumping:

% mysqldump -u ocp6 -pocp6 ocp6 --single-transaction --result-file=dump.sql 

Restauration:

% mysql -u ocp6 -pocp6 ocp6 < dump.sql

Tout va bien.

Avec l'utilisation de Un autre client MySQL (mycli dans ma situation) pour restaurer le fichier de décharge:

mysql ocp6@:(none)> \. dump.sql
[…]
(1005, 'Can\'t create table `ocp6`.`composition` (errno: 150 "Foreign key constraint is incorrectly formed")')

Je suppose que mycli ne comprend pas commentaires conditionnels.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top