SQL Server中外键列转普通列操作遇错及困惑
如何将外键列转换为普通列(解决删除约束报错问题)
看来你在把外键转成普通列的时候踩了个小坑——因为没找对真正的外键约束名称,导致删除报错,后来自己新建约束再删也只是处理了新的,没碰着原来的那个。别慌,咱们一步步来解决:
第一步:找到表中真实存在的外键约束名称
报错“不是约束”大概率是你用的约束名不对,先把表上所有外键的真实名字查出来:
针对SQL Server的查询语句
-- 方法1:通过information_schema视图查询 SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = 'Group_Resources' AND constraint_type = 'FOREIGN KEY'; -- 方法2:通过系统目录视图查询 SELECT name AS foreign_key_name FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID('Group_Resources');
执行任意一条,就能得到Group_Resources表上所有外键的名称,这里面就包含你要删除的那个原外键。
如果是MySQL数据库
用这条语句查看表的创建语句,里面会明确列出所有外键约束:
SHOW CREATE TABLE Group_Resources;
第二步:删除正确的外键约束
拿到真实的外键名称后,执行删除语句(把[实际外键名称]换成你查到的名字,如果名称里有特殊字符,记得用方括号或反引号括起来):
ALTER TABLE Group_Resources DROP CONSTRAINT [实际外键名称];
第三步:验证操作结果
再跑一遍第一步的查询语句,确认外键已经被删除,此时resource_id就变成普通列了,不再和Resources表有外键关联。
为什么你之前的操作没解决问题?
你后来新建的fk_gr_res_resources是一个全新的外键约束,删除它只是移除了你自己加的关联,并没有碰原来那个你想删的外键。核心问题就是一开始没找对原外键的真实名称。
内容的提问来源于stack exchange,提问作者Rasindu De Alwis
相关产品推荐
相关产品推荐

