8

コマンドを使用してスキーマを更新しようとしていますapp/console doctrine:schema:update --forceが、Doctrine は次の部分で失敗します:

An exception occurred while executing 'DROP INDEX IDX_E98F2859A074D5D7 ON contract':                               
SQLSTATE[HY000]: General error: 1553 Cannot drop index 'IDX_E98F2859A074D5D7': needed in a foreign key constraint

これは、別の SO questionに従って解決するのは簡単です。テーブルには次のものがあります。

KEY `IDX_E98F2859A074D5D7` (`some_table_id`),
CONSTRAINT `FK_E98F2859A074D5D7` FOREIGN KEY (`some_table_id`) REFERENCES `some_table` (`id`)

したがって、これは一致する制約を削除することで手動で解決できます。しかし、それを自動的に行う方法はありますか?

4

1 に答える 1

7

情報スキーマを使用すると、必要なALTER TABLEコマンドを簡単に作成できます。関連するテーブルは次のとおりです: SCHEMA KEY_COLUMN_USAGEおよびSTATISTICS

以下は、DDL ステートメントを生成するクエリの例です。

SELECT CONCAT('ALTER TABLE ',kcu.TABLE_NAME,' DROP FOREIGN KEY ', kcu.CONSTRAINT_NAME,';') AS ddl  
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu, INFORMATION_SCHEMA.STATISTICS stat  
WHERE stat.table_schema = 'your_schema' 
AND kcu.TABLE_NAME = stat.TABLE_NAME   
AND kcu.COLUMN_NAME = stat.COLUMN_NAME
AND kcu.REFERENCED_TABLE_NAME IS NOT NULL
INTO OUTFILE '/tmp/ddl.sql';

そして、次のステートメントを実行して、レビュー後に実行できます。

SOURCE '/tmp/ddl.sql';

上記のステートメントは、同じテーブルの同じ外部キー列にインデックスが存在するすべての外部キー制約について、制約名と対応するテーブル名を検索します。結果は で指定されたファイルに保存されますINTO OUTFILE

生成された ddl を実行する前に、上記のステートメントを注意深く確認してください。

于 2013-08-21T11:22:10.680 に答える