MySQL删除自引用外键约束时触发#1091错误的技术咨询
Magento 2数据库迁移:重复外键约束与删除失败问题解决
问题现象
迁移Magento 2数据库时触发以下错误:
SQLSTATE[HY000]: General error: 1826 Duplicate foreign key constraint name `MGA7_CAT_CTGR_ENTT_DEC_ATTR_ID_MGA7_EAV_ATTR_ATTR_ID`
原因是Magento尝试创建的外键约束已存在,但执行删除语句时:
ALTER TABLE `mga7_catalog_category_entity_decimal` DROP FOREIGN KEY `MGA7_CAT_CTGR_ENTT_DEC_ATTR_ID_MGA7_EAV_ATTR_ATTR_ID`;
MySQL返回#1091错误,提示约束不存在,可通过以下查询却能查到该约束:
SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME = 'MGA7_CAT_CTGR_ENTT_DEC_ATTR_ID_MGA7_EAV_ATTR_ATTR_ID';
核心原因
出现这种矛盾的常见原因有三个:
- 约束不属于目标表:原查询未限定数据库和表名,可能查到其他表的同名约束
- 大小写不匹配:Linux环境下MySQL对表名、约束名区分大小写,若实际约束名大小写与执行语句不一致会导致删除失败
- 约束类型错误:
TABLE_CONSTRAINTS包含主键、唯一键、外键等所有约束类型,你查到的可能不是外键,而是其他类型约束
解决步骤
1. 精准定位约束信息
先执行以下查询,明确约束所属的数据库、表和类型:
SELECT CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME = 'MGA7_CAT_CTGR_ENTT_DEC_ATTR_ID_MGA7_EAV_ATTR_ATTR_ID' AND TABLE_SCHEMA = '你的数据库名称'; -- 替换为实际数据库名
2. 确认外键关联细节
进一步查询约束的关联列和表,避免误删:
SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_NAME = 'MGA7_CAT_CTGR_ENTT_DEC_ATTR_ID_MGA7_EAV_ATTR_ATTR_ID' AND TABLE_SCHEMA = '你的数据库名称';
3. 正确删除外键
根据上述查询结果,执行对应操作:
- 如果约束确实属于
mga7_catalog_category_entity_decimal表且为外键,确保删除语句中的表名、约束名大小写与实际一致(比如Linux环境下严格匹配),重新执行删除 - 如果约束属于其他表,切换到对应表执行删除语句
4. 临时禁用外键检查(应急方案)
若删除操作仍受阻,可临时关闭MySQL外键检查,完成迁移后再恢复:
-- 禁用外键检查 SET FOREIGN_KEY_CHECKS = 0; -- 执行Magento迁移脚本 -- 恢复外键检查 SET FOREIGN_KEY_CHECKS = 1;
⚠️ 注意:此方法可能导致数据一致性问题,仅用于应急,迁移完成后需验证数据完整性。
验证
删除约束后,重新执行查询确认约束已不存在:
SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME = 'MGA7_CAT_CTGR_ENTT_DEC_ATTR_ID_MGA7_EAV_ATTR_ATTR_ID' AND TABLE_SCHEMA = '你的数据库名称';
确认无结果后,再次执行Magento迁移脚本。
内容的提问来源于stack exchange,提问作者Roly89
相关产品推荐
相关产品推荐

