web-dev-qa-db-fra.com

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

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.

40
Tai Squared

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 */;
44
Phil Ross

Faites attention . Pour une raison quelconque, mysqldump n'écrit pas FOREIGN_KEY_CHECKS = 0 si l'option --compact est utilisée.

Ciao.

30
edtruant

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. 

11
alds

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

8
iRonin

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 .

1
freezed