唯一键和索引(IsUnique=Yes)之间有什么区别?

52

我有一张带有主键的表,但我想让另外两列被限制,以确保它们的组合始终是唯一的。

(一个愚蠢的例子:在 BOOKS 表中,IBAN 列是主键,但标题和作者列的组合也应始终是唯一的。)

在 SQL Server Management Studio 中,可以创建一个新索引并将 IsUnique 设置为 Yes,也可以创建一个新的 Unique Key。

这两种方法之间有什么区别,哪个更适合哪些目的?

两种方法都可以用来确保列组合唯一性,但主要区别在于索引与约束之间的功能差异。

唯一约束(Unique Key)是一种规则或限制,可确保在一列或多列中没有重复值。如果尝试插入具有重复值的行,则会发生错误。因此,适用于需要强制执行唯一性约束的情况。

索引则可以加快根据特定列或列组合的值进行数据查询的速度,并且可以选择将其设置为唯一索引。但是,它并不会强制执行唯一性。因此,适用于需要快速查询数据的情况。

在这种情况下,由于您需要确保两列的组合始终是唯一的,因此使用 Unique Key 约束更加合适。


5
如有必要:如果您需要允许多行为NULL,但任何非NULL行都必须是唯一的,请使用触发器或带有唯一索引的视图进行强制执行。创建视图xxx并选择Title、Author从Books中,其中(Title + Author)不为空,然后在该视图上创建索引。 - Kristen
谢谢,Kirsten,那是有用的信息! - JacobE
1
请参见https://dev59.com/TXRC5IYBdhLWcg3wP-dh - Darren Griffith
6个回答

36

创建唯一约束是规则更加明确的陈述。索引的IsUnique属性是实现细节 - 规则是如何实现的,而不是规则是什么。 不过,效果是相同的。


1
@pylover:在某些情况下,约束(例如外键或非空)可以通过提供优化器无法获得的有用信息来提高性能。在唯一性方面,我想约束和索引之间没有区别,但不确定是否完全正确。 - Tony Andrews

8

这两者之间有明显的区别。 唯一约束定义了哪些列的组合必须是唯一的。 唯一索引只是确保上述内容始终有效的一种方式。 但是,可以拥有支持唯一约束的非唯一索引。 (如果约束是可推迟的=仅在提交时必须有效,但允许在事务中断开)


6

请注意,当您创建唯一约束时,SQL Server 会在后台创建一个索引。


4

我刚刚通过一种艰难的方式发现一个问题,即在SSMS中默认情况下唯一键的脚本设置为true,而索引的脚本设置为false。当我使用SSMS的“脚本表”上下文菜单时,我没有得到我的唯一索引。

此外,如果将类型设置为唯一键,则无法更改“忽略重复键”设置。首先必须将类型从唯一键更改为索引,然后才能将“忽略重复键”设置为true。


0

我认为它们之间没有任何区别,但是使用唯一索引,我们可以获得两个好处,因为该列已经是唯一的,并且还有索引,所以搜索速度会更快。因此,使用唯一索引更有益。


0

唯一索引是唯一键。


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