如何移除SQL中未指定名称的列唯一约束?
解决未命名唯一约束的删除问题
当你直接在列后加unique创建未命名唯一约束后,没法直接用DROP CONSTRAINT删除,得先找到数据库自动生成的约束名,或者用对应数据库的专属方法删除。
一、先查自动生成的约束名
不同数据库的查询方式不一样,下面是主流数据库的操作:
MySQL/MariaDB
执行这条语句,找到对应employee_boss_id的唯一索引名称:
SHOW INDEX FROM frontend_employee WHERE Key_name != 'PRIMARY';
MySQL里列级UNIQUE会自动生成和列名同名的索引,所以大概率Key_name就是employee_boss_id。
PostgreSQL
查系统表获取约束名:
SELECT conname FROM pg_constraint WHERE conrelid = 'frontend_employee'::regclass AND contype = 'u' AND conkey = ARRAY(SELECT attnum FROM pg_attribute WHERE attrelid = 'frontend_employee'::regclass AND attname = 'employee_boss_id');
SQL Server
通过系统视图查询:
SELECT name FROM sys.key_constraints WHERE parent_object_id = OBJECT_ID('frontend_employee') AND type = 'UQ' AND COL_NAME(parent_object_id, parent_column_id) = 'employee_boss_id';
二、删除约束
拿到约束名后,执行标准删除语句:
ALTER TABLE frontend_employee DROP CONSTRAINT 你的约束名;
- MySQL还可以直接用索引名删除,和上面效果一样:
ALTER TABLE frontend_employee DROP INDEX employee_boss_id; - SQL Server如果约束名有特殊字符,记得用方括号包裹:
DROP CONSTRAINT [你的约束名]
额外提示
以后创建约束最好用CONSTRAINT指定名称,就像你给出的示例那样,方便后续维护:
create table frontend_employee( employee_id int primary key, employee_name varchar(50), employee_role varchar(50), employee_sarlary int default 25000, employee_boss_id int, CONSTRAINT UC_employee UNIQUE (employee_boss_id), foreign key(employee_boss_id) references frontend_boss(boss_id) );
内容的提问来源于stack exchange,提问作者vivek singh parmar
相关产品推荐
相关产品推荐

