La mise à jour du schéma de doctrine Symfony2 échoue
J'ai créé la base de données sur ma machine locale. Après le déplacement de mon projet de serveur j'ai importé une sauvegarde locale (parce que j'ai eu quelques données importantes).
Maintenant,quand je suis en train de mettre à jour le schéma sur mon serveur, il donne à mon cette sortie:
php app/console doctrine:schema:update --force
Updating database schema...
[Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException]
An exception occurred while executing 'ALTER TABLE golf_course ADD CONSTRAINT FK_EC96E162F1503E2B FOREIGN KEY (golf_id) REFERENCES golf (id)':
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9
6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))
[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9
6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9
6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))
Pourquoi cela se produit ? Est-il une solution ?
source d'informationauteur Maxian Nicu
Vous devez vous connecter pour publier un commentaire.
Votre problème est que vous voulez modifier une table avec contrainte existante. Je vois deux solutions:
Si vous êtes dans le dev, vous pouvez reconstruire votre base de données
Si vous êtes dans la production c'est un peu plus compliqué.
Une solution que je vois est que vous pouvez créer une commande pour sauvegarder vos données, supprimer les données dans les tables que vous souhaitez modifier votre schéma, recharger les données une fois que le tableau est modifié. Selon les modifications, il ne devrait pas prendre plus de 2 ou 3 heures. Assurez-vous d'avoir une sauvegarde au cas où votre commande va vers le sud.
@maxian
Michael Villeneuve réponse n'est pas totalement droit. Dans le cas d'un environnement de production ou sorte de , vous pouvez vous contenter t drop schema et de le recréer.
La seule façon de l'exécuter sur votre schéma actuel est par la suite :
"set foreign_key_checks=1;"
je ne peux pas assurer que vous avez gagné t a perdu quelques touches, mais vous don t drop de vos données à tous .
Schéma de mise à jour avec de clé étrangère vérifie désactivé
Si la Doctrine mises à jour de schéma d'échouer en raison de contraintes de clé étrangère, il vous suffit de désactiver la clé étrangère vérifie pour cette mise à jour.
Comme un one-liner, vous pouvez exécuter:
Cela ajoute
set foreign_key_checks = 0;
à la sortie deapp/console doctrine:schema:update --dump-sql
de sorte qu'il appelle en fait exactement ce que la Doctrine appel, mais avec de clé étrangère vérifie désactivé. Configurer lemysql
appel à vos besoins.Votre schéma est mis à jour et selon vos modifications aucune donnée n'est perdue.
Gardez à l'esprit que parfois l'ordre des requêtes est important et la Doctrine n'a tout simplement pas de l'ordre de leur droit. Dans ce cas, vous devez commander les requêtes correctement par votre propre et utiliser ensuite cette liste ordonnée des requêtes au lieu.
Pour moi, il a travaillé avec la configuration suivante (avec les deux relations). L'astuce est de ne pas mélanger
mappedBy
etinversedBy
.