使列唯一强制创建索引吗?

时间:2009-05-25 21:03:12

标签: sql sql-server

在SQL Server 2005+(我同时使用两者)中,是否将UNIQUE约束添加到列中会自动创建索引,还是应该CREATE INDEX

3 个答案:

答案 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 CONSTRAINTUNIQUE INDEX:一个命令只是另一个命令的同义词。

Oracle的唯一区别是UNIQUE INDEX应该具有用户提供的名称,而UNIQUE CONSTRAINT可以使用系统生成的名称创建:

ALTER TABLE mytable MODIFY col1 UNIQUE

这将创建一个名为SYS_CXXXXXX的索引。

答案 2 :(得分:1)

添加唯一约束时会创建索引:

Reference - 见第二段。

  

添加UNIQUE约束时   一个或多个现有列   表,默认情况下是数据库引擎   检查中的现有数据   列以确保所有值都是   独特。如果是UNIQUE约束   添加到已复制的列   值,数据库引擎返回一个   错误并且不添加约束。

     

数据库引擎自动   创建一个UNIQUE索引来强制执行   UNIQUE的唯一性要求   约束。因此,如果尝试   插入一个重复的行,即   数据库引擎返回错误   声明UNIQUE的消息   约束已被违反并且确实存在   不要将行添加到表中。除非a   聚集索引是显式的   指定的,独特的,非聚集的   默认情况下会创建索引以强制执行   UNIQUE约束。