如何使用ALTER TABLE ADD CONSTRAINT生成Index类型对象而非Unique Key?
问题分析与解决方案
在SQL Server中,唯一约束(Unique Key)的底层实现依赖唯一索引:当你执行ALTER TABLE ... ADD CONSTRAINT UNIQUE NONCLUSTERED语句时,数据库会自动创建对应的唯一非聚集索引来保证唯一性,但你在对象列表中看到的Type为Unique Key的是约束本身的对象,而对应的索引是它的依赖对象。你可以通过以下查询查看这个自动生成的索引:
SELECT i.name AS index_name, i.type_desc AS index_type FROM sys.indexes i JOIN sys.key_constraints kc ON i.object_id = kc.parent_object_id AND i.name = kc.name WHERE kc.name = '你的约束名称';
如果你的需求是直接创建一个类型为Index的独立对象(而非依附于约束的索引),同时实现唯一性校验,那么ALTER TABLE ADD CONSTRAINT语法无法直接达成——因为这个命令的作用就是创建约束对象。你需要改用CREATE UNIQUE INDEX语句:
CREATE UNIQUE NONCLUSTERED INDEX IX_表名_列名 ON 你的表名(目标列名);
若你坚持要通过ALTER TABLE流程操作,可以先添加唯一约束(自动生成索引),再删除约束保留索引:
-- 添加唯一约束,自动创建对应索引 ALTER TABLE 你的表名 ADD CONSTRAINT UQ_表名_列名 UNIQUE NONCLUSTERED (目标列名); -- 删除约束,但保留底层索引 ALTER TABLE 你的表名 DROP CONSTRAINT UQ_表名_列名;
执行完成后,你会得到一个类型为Index的唯一非聚集索引,且同样能实现数据唯一性校验。
内容的提问来源于stack exchange,提问作者Arvo Bowen
相关产品推荐
相关产品推荐

