ローカルマシンにデータベースを作成しました。プロジェクトをサーバーに移動した後、ローカルからバックアップをインポートしました(そこにいくつかの重要なデータがあったため)。
これで、サーバーのスキーマを更新しようとすると、次の出力が表示されます。
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`))
なぜこれが起こるのですか?解決策はありますか?
あなたの問題は、既存の制約でテーブルを変更したいということです。私は2つの解決策を見ます:
開発中の場合は、データベースを再構築できます
doctrine:database:drop --force
doctrine:database:create
doctrine:schema:create
本番環境にいる場合は、もう少し複雑です。
私が見ている解決策の1つは、データを保存したり、変更するテーブルのデータを削除したり、スキーマを変更したり、テーブルが変更されたらデータを再読み込みしたりするコマンドを作成できることです。変更にもよりますが、2〜3時間以上かかることはありません。コマンドが南に移動した場合に備えて、バックアップがあることを確認してください。
@maxian
MichaelVilleneuveの答えは完全に正しいわけではありません。本番環境またはある種の場合、スキーマを削除して再作成することはできません。
現在のスキーマでそれを実行する唯一の方法は、次の方法です。
一部のキーを紛失しないことを保証することはできませんが、データをまったく削除しません。
外部キーの制約のためにDoctrineスキーマの更新が失敗した場合は、この特定の更新の外部キーチェックを無効にする必要があります。
ワンライナーとして、以下を実行できます。
mysql -e "set foreign_key_checks = 0; `app/console doctrine:schema:update --dump-sql`"
これにより、set foreign_key_checks = 0;
の出力の前にapp/console doctrine:schema:update --dump-sql
が追加されるため、実際にはDoctrineが呼び出すものを正確に呼び出しますが、外部キーチェックは無効になります。mysql
を構成します。あなたのニーズに電話してください。
スキーマが更新され、変更に応じてデータが失われることはありません。
クエリの順序が重要な場合がありますおよびDoctrineは単にそれらを正しく順序付けしなかったことを覚えておいてください。この場合、クエリを正しく順序付ける必要があります。所有してから、代わりにその順序付けられたクエリのリストを使用します。
新しいテーブルのフィールドに関連する値を追加する必要があります。
例:テーブルAとBがあり、BがA(a_id)のキーを持っている場合、ID = 1のフィールドをAに追加する必要があり、テーブルBでa_idを次の値に変更する必要があります。テーブル-1この場合は1(すべてのフィールドに対してこれを作成します)。
その後、実行:php app/console doctrine:schema:update --force
よろしく