Lorsque j'exécute une commande mysqldump sur ma base de données, puis que je tente de l'importer, l'opération échoue car elle tente de créer les tables par ordre alphabétique, même si une clé étrangère peut faire référence à une table plus loin dans le fichier. Il ne semble y avoir rien dans la documentation et j'ai trouvé des réponses comme this qui disent de mettre à jour le fichier après l'avoir créé pour inclure:
set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;
N'y a-t-il pas 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 simple de s’assurer que je peux transférer un fichier, puis l’importer sans le mettre à jour manuellement.
La commande mysqldump incluse dans MySQL 5.0.51 (et selon les versions du journal des modifications depuis 4.1.1 ) désactive les vérifications de clé étrangère. Par défaut, mysqldump inclut la ligne suivante en haut du fichier de vidage:
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
La syntaxe /*!40014 ... */
est un commentaire conditionnel qui sera exécuté sur MySQL 4.0.14 et versions ultérieures. L'ancien paramètre de vérification de la clé étrangère est restauré à la fin du fichier de vidage:
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
Faites attention . Pour une raison quelconque, mysqldump n'écrit pas FOREIGN_KEY_CHECKS = 0 si l'option --compact est utilisée.
Ciao.
Si vous utilisez phpMyAdmin lors de l'exportation SQL, choisissez Méthode d'exportation personnalisée . Ensuite, parmi les options de case à cocher, cliquez sur " Désactiver les vérifications de clé étrangère ". L'instruction SQL exportée aura les contrôles disable et active les clés étrangères au début et à la fin du fichier de sortie, respectivement.
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
en tant qu'une de vos commandes mysqldump
. --compact
inclut --skip-comments
donc au lieu --compact
on devrait utiliser --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset
Faites attention à votre client MySQL que vous utilisez, avec la commande mysql
, 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 un autre client MySQL ( mycli dans ma situation), restaurez le fichier de vidage
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 comprends pas commentaires conditionnels .