唯一约束和唯一索引有什么区别?

13

以下两个语句有什么不同?

alter table [dbo].[Demo] add constraint [UC_Demo_Code] unique ( [Code] )
go
create unique nonclustered index [UK_Demo_Code] on [dbo].[Demo] ( [NB_Code] )
go

这个约束是否有一个索引来帮助确保唯一性,还是每次插入/更新都要进行全表扫描?


请查看http://dba.stackexchange.com/a/55139/6548以获取详细答案。 - Rory
3个回答

11

"逻辑"效果相同——只能加载唯一值到表中。(值得注意的是,如果列允许为空,则只能插入1行具有NULL的记录。)

物理效果也相同——在表上建立唯一索引。它可以是聚集或非聚集的。

唯一的真正区别在于元数据,即存储在系统表中描述数据库的信息。第一种方式将其内部记录为索引,而第二种方式将其记录为约束——尽管净效果相同。这意味着,最终唯一的区别是创建它和将来修改它所需的代码。

(这在SQL 7.0到2005中成立,如果在2008中有变化,我会非常惊讶。)


值得注意的是,唯一索引可以进行过滤,例如 create unique nonclustered index IX_relation ON dbo.Person(relation) where relation is not null。这在唯一约束中是不可能的。 - H. de Jonge
非常正确。过滤索引是在2008年推出的新功能;这个答案可以追溯到2010年初,我相当确定当时还没有使用过它。现在,由于唯一约束创建了一个索引,我会说“称之为索引并完成它”。 - Philip Kelley

2
你可以查看 唯一约束和唯一索引 进行比较。
文章得出结论,除了唯一约束也在数据库中列出为约束对象之外,唯一约束和唯一索引之间没有实际区别。由于唯一约束无法禁用,具有约束状态并不会使唯一约束具有除唯一索引外的任何其他行为。但是,有几个索引创建选项不适用于创建唯一约束的 ALTER TABLE 命令。

0

抱歉我第一次回答错误。唯一约束和唯一索引是相同的。在内部,它确实创建了一个索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接