【问题标题】:Doctrine schema update fails on foreign key外键上的教义模式更新失败
【发布时间】:2013-08-03 03:19:10
【问题描述】:

我正在尝试使用 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`)

所以这可以通过删除匹配约束来手动解决。但是有没有办法自动完成呢?

【问题讨论】:

  • 你在哪个表上有一个 FK,你到底在做什么,会抛出这个错误?
  • @Sonali 希望能提供答案(doctrine:schema:update)。架构更新正在删除索引,但在它之前没有删除外键。
  • 我认为您将不得不删除 FK 并重新添加它。对不起,如果我错了...
  • 当然,正如我在问题中提到的 - 我可以做到这一点,而且是可行的。我正在寻找一些以某种方式自动化的替代方案(并且最好不涉及--dump-sql 输出上的grep/sed/awk)。除非答案是“教义无法做到这一点,请继续编写更新脚本”——这对我来说也很好。
  • 这似乎是 MySQL 存在的错误。当我迁移到 MariaDB 时,问题就消失了。

标签: mysql doctrine schema-migration


【解决方案1】:

如果使用信息模式,可以轻松构造必要的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 之前仔细查看上述语句。

【讨论】:

  • 请注意,如果您有相互引用的键,则删除第一个键会同时删除两个键,当您尝试删除第二个键时会出错。
  • 我将语句复制并粘贴到 phpmyadmin 中,但第一行已经失败并出现错误:#1025 - Error on rename of './webbase/aanmelding' to './webbase/#sql2-472-c5' (errno: 152)
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 2023-03-06
  • 2014-10-04
  • 1970-01-01
  • 2015-05-31
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多