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_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 之前仔细查看上述语句。

于 2013-08-21T11:22:10.680 回答