如何在MySQL中删除两张表之间的关联?重复添加相同关联后无法删除
重复表关联约束删除操作指南
核心原因说明
你之前重复执行关联创建命令后无法删除多余关联,本质是数据库在检测到重名约束时会自动生成带后缀的唯一约束名,你之前的删除操作只针对自己自定义的那个约束名,没有命中系统自动生成的带后缀冗余约束,导致删除失效。
第一步:查询两张表之间所有的关联约束
不同数据库查询系统表的命令不同,可对应自己使用的数据库执行:
- MySQL 环境执行:
SELECT CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME = '当前需要删除约束的子表名' AND REFERENCED_TABLE_NAME = '被关联的父表名' AND CONSTRAINT_NAME != 'PRIMARY'; - PostgreSQL 环境执行:
SELECT conname FROM pg_constraint WHERE conrelid = '子表名'::regclass AND confrelid = '父表名'::regclass; - SQL Server 环境执行:
SELECT name FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID('子表名') AND referenced_object_id = OBJECT_ID('父表名');
第二步:逐个删除查询到的冗余约束
拿到上一步查到的所有约束名后,对应执行删除命令即可:
- MySQL 删除关联约束:
ALTER TABLE 子表名 DROP FOREIGN KEY 上一步查到的约束名;
比如查询到约束列表为fk_dept_id、fk_dept_id_1、fk_dept_id_2,就需要依次替换约束名执行三次删除语句,清除所有重复关联。 - PostgreSQL / SQL Server 删除关联约束:
ALTER TABLE 子表名 DROP CONSTRAINT 上一步查到的约束名;
注意事项
删除操作前请核对每个约束的关联关系,不要误删业务必需的约束、主键约束。如果执行删除时报错提示约束不存在,请重新执行第一步的查询命令获取最新的约束名,排除输入笔误、大小写不匹配导致的删除失败问题。
内容的提问来源于stack exchange,提问作者Jesse henrique
相关产品推荐
相关产品推荐

