我正试图使用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问题,这是微不足道的。该表具有:
KEY `IDX_E98F2859A074D5D7` (`some_table_id`),
CONSTRAINT `FK_E98F2859A074D5D7` FOREIGN KEY (`some_table_id`) REFERENCES `some_table` (`id`)
因此,可以通过删除匹配约束手动解决此问题。但有没有一种方法可以自动做到这一点?
如果使用信息模式,则可以轻松构建必要的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之前,请仔细查看以上语句。