web-dev-qa-db-ja.com

Symfony2 Doctrineスキーマの更新に失敗しました

ローカルマシンにデータベースを作成しました。プロジェクトをサーバーに移動した後、ローカルからバックアップをインポートしました(そこにいくつかの重要なデータがあったため)。

これで、サーバーのスキーマを更新しようとすると、次の出力が表示されます。

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`))                                                                                                             

なぜこれが起こるのですか?解決策はありますか?

12
Maxian Nicu

あなたの問題は、既存の制約でテーブルを変更したいということです。私は2つの解決策を見ます:

開発中の場合は、データベースを再構築できます

doctrine:database:drop --force
doctrine:database:create
doctrine:schema:create

本番環境にいる場合は、もう少し複雑です。

私が見ている解決策の1つは、データを保存したり、変更するテーブルのデータを削除したり、スキーマを変更したり、テーブルが変更されたらデータを再読み込みしたりするコマンドを作成できることです。変更にもよりますが、2〜3時間以上かかることはありません。コマンドが南に移動した場合に備えて、バックアップがあることを確認してください。

9

@maxian

MichaelVilleneuveの答えは完全に正しいわけではありません。本番環境またはある種の場合、スキーマを削除して再作成することはできません。

現在のスキーマでそれを実行する唯一の方法は、次の方法です。

  1. php app/console doctrine:schema:update --dump-sql。出力をコピーします。スキーマを更新するための直接SQLクエリ
  2. mysqlをmysqlコマンドラインまたはmysqlクライアントを介して接続します
  3. このクエリを呼び出して外部キーチェックを無効にします: "set external_key_checks = 0;"
  4. doctrine:schema:updateからクエリを入力
  5. 「setforeign_key_checks = 1;」で外部キーチェックを有効にする

一部のキーを紛失しないことを保証することはできませんが、データをまったく削除しません。

外部キーチェックを無効にしたスキーマの更新

外部キーの制約のために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は単にそれらを正しく順序付けしなかったことを覚えておいてください。この場合、クエリを正しく順序付ける必要があります。所有してから、代わりにその順序付けられたクエリのリストを使用します。

8
flu

新しいテーブルのフィールドに関連する値を追加する必要があります。

例:テーブルAとBがあり、BがA(a_id)のキーを持っている場合、ID = 1のフィールドをAに追加する必要があり、テーブルBでa_idを次の値に変更する必要があります。テーブル-1この場合は1(すべてのフィールドに対してこれを作成します)。

その後、実行:php app/console doctrine:schema:update --force

よろしく

0
amic