在SQL Server 2005+(我同时使用两者)中,是否将UNIQUE
约束添加到列中会自动创建索引,还是应该CREATE INDEX
?
答案 0 :(得分:8)
请参阅此MSDN article:
数据库引擎自动 创建一个UNIQUE索引来强制执行 UNIQUE的唯一性要求 约束
如果你确实创建了一个索引,你最终会得到两个索引,如本例所示:
create table TestTable (id int)
alter table TestTable add constraint unique_id unique (id)
create unique index ix_TestTable_id on TestTable (id)
select * from sys.indexes where [object_id] = object_id('TestTable')
这将在TestTable上显示两个唯一索引;和表示表本身的HEAP。
答案 1 :(得分:2)
是的,确实如此。
事实上,您甚至可以创建CLUSTERED UNIQUE CONSTRAINT
:
ALTER TABLE mytable ADD CONSTRAINT UX_mytable_col1 UNIQUE CLUSTERED (col1)
,这将使表格聚集在col1
。
几乎所有数据库都为UNIQUE CONSTRAINT
创建索引,否则维护它将非常困难。
Oracle
甚至不区分UNIQUE CONSTRAINT
和UNIQUE INDEX
:一个命令只是另一个命令的同义词。
Oracle
的唯一区别是UNIQUE INDEX
应该具有用户提供的名称,而UNIQUE CONSTRAINT
可以使用系统生成的名称创建:
ALTER TABLE mytable MODIFY col1 UNIQUE
这将创建一个名为SYS_CXXXXXX
的索引。
答案 2 :(得分:1)
添加唯一约束时会创建索引:
Reference - 见第二段。
添加UNIQUE约束时 一个或多个现有列 表,默认情况下是数据库引擎 检查中的现有数据 列以确保所有值都是 独特。如果是UNIQUE约束 添加到已复制的列 值,数据库引擎返回一个 错误并且不添加约束。
数据库引擎自动 创建一个UNIQUE索引来强制执行 UNIQUE的唯一性要求 约束。因此,如果尝试 插入一个重复的行,即 数据库引擎返回错误 声明UNIQUE的消息 约束已被违反并且确实存在 不要将行添加到表中。除非a 聚集索引是显式的 指定的,独特的,非聚集的 默认情况下会创建索引以强制执行 UNIQUE约束。