2013-08-02 22 views
7

に失敗した私は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 

これはanother SO questionに応じて解決するのは簡単です。テーブルには次のものがあります。

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

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

+0

あなたはテーブルにFKを持っていますが、このエラーがスローされた正確なことは何ですか? –

+0

@Sonaliうまくいけば答えが得られました(doctrine:schema:update)。スキーマの更新によってインデックスが削除されていますが、その前に外部キーは削除されません。 – viraptor

+0

あなたはFKを落としてもう一度追加する必要があると思います。申し訳ありませんが、私が間違っている場合... –

答えて

7

あなたは情報スキーマを使用する場合は、簡単に必要なALTER TABLEコマンドを構築することができます。関連する表はSCHEMA KEY_COLUMN_USAGESTATISTICSです。続き

は、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を実行する前に、上記のステートメントを確認してください。

+0

お互いを参照するキーがある場合は、最初のキーを削除すると両方が削除され、2番目のキーを削除しようとするとエラーが発生することに注意してください。 –

+0

phpmyadminに文をコピーして貼り付けましたが、最初の行は既にエラーで失敗しています: '#1025 - './webbase/aanmelding'の名前を './webbase/#sql2-472-c5'(errno :152) ' – rolandow

関連する問題