INDEX创建的UNIQUE参数 - 有什么用?

时间:2010-09-26 17:57:35

标签: sql sql-server tsql indexing unique-index

为什么INDEX创建语句有UNIQUE参数?

据我所知,非聚集索引包含一个书签,一个指向行的指针,它应该是唯一的,以区分甚至非唯一的行,
所以确保非聚集索引是唯一的?
正确吗?

那么,我是否理解没有唯一索引只能在聚簇表上?从那以后

  • “视图上的聚簇索引必须是唯一的”[1]

由于“聚集索引的底部或叶子级别包含表的实际数据行”[1],我是否正确理解通过唯一约束可以实现与UNIUE相同的聚集索引效果(可能全部或部分表格的列[2]?

然后,什么为索引带来UNIQUE参数?
除了混淆基本概念定义[3]


更新:
这也是同样的陷阱 - 解释已经多次解释的事情,基于未定义的术语将所有解释转换为永无止境的猜谜游戏。
请参阅我的问题[4],这是对这个问题的重新措辞。


UPDATE2:
问题是模糊不清,缺乏定义或在不恰当的背景下不恰当地使用术语。如果index被定义为服务于(查找和)识别/指向实际数据的结构,则非唯一或NULL索引没有任何意义。再见



[1]
CREATE INDEX(Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188783.aspx

[2]
CREATE TABLE(Transact-SQL) http://msdn.microsoft.com/en-us/library/ms174979.aspx

[3]
唯一索引或唯一键?
Unique index or unique key?

[4]
什么是索引,非聚集索引可以是非唯一的?
what is index and can non-clustered index be non-unique?

4 个答案:

答案 0 :(得分:6)

虽然非唯一索引足以区分行(如您所述),但UNIQUE索引充当约束:它将防止重复项输入数据库 - 其中“重复”是行在索引列中包含相同的数据。

示例:

 Firstname  | Lastname  | Login
================================
 Joe        | Smith     | joes
 Joe        | Taylor    | joet
 Susan      | Smith     | susans

我们假设登录名默认是从名字+姓氏的第一个字母生成的。

当我们尝试将Joe Sciavillo添加到数据库时会发生什么?通常,系统会愉快地生成登录名joes并插入(Joe,Sciavillo,joes)。现在我们有两个用户具有相同的用户名 - 可能是一件坏事。

现在假设我们在UNIQUE列上有一个Login索引 - 在允许插入新行之前,数据库将检查是否已存在具有相同数据的其他行。换句话说,插入另一个joes的尝试将被拒绝,因为该数据在该行中不再是唯一的。

当然,您可以在多个列上拥有唯一索引,在这种情况下,组合数据必须是唯一的(例如,Firstname,Lastname上的唯一索引将很乐意接受一行使用(Joe,Badzhanov),因为该组合尚未在表中,但会拒绝使用(Joe,Smith)的第二行

答案 1 :(得分:2)

UNIQUE索引子句实际上只是SQL Server和其他一些DBMS中语法的怪癖。在标准SQL中,唯一性约束是通过使用PRIMARY KEY和UNIQUE CONSTRAINT语法实现的,而不是通过索引实现的(标准SQL中没有索引)。

SQL Server内部用于实现唯一性约束的机制称为唯一索引。每当您创建PRIMARY KEY或UNIQUE约束时,都会自动为您创建唯一索引。出于SQL Server开发团队最熟悉的原因,他们决定将UNIQUE关键字作为CREATE INDEX语法的一部分公开,即使约束语法执行相同的工作。

为了清晰和标准支持,我建议您尽可能避免明确地创建UNIQUE索引。改为使用PRIMARY KEY或UNQIUE约束语法。

答案 2 :(得分:0)

UNIQUE子句指定列中的值在表中必须是唯一的,实质上是添加唯一约束。表上的聚簇索引指定表中行的顺序与索引相同。非聚集索引不会更改物理排序,这就是为什么可以有多个非聚集索引但只有一个聚簇索引。您可以在表上拥有唯一或非唯一的聚簇索引和非聚簇索引。

答案 3 :(得分:0)

我认为基本问题是:唯一索引和非唯一索引之间有什么区别?

答案是唯一索引中的条目每个只能指向一行,而非唯一索引中的条目可以指向多行。

例如,考虑订单商品表:

ORDER_NO     INTEGER
LINE_NO      INTEGER
PRODUCT_NO   INTEGER
QUANTITY     DECIMAL

- 在ORDER_NO和LINE_NO上使用唯一索引,在PRODUCT_NO上使用非唯一索引。

对于ORDER_NO和LINE_NO的单个组合,表中只能有一个条目,而对于单个值PRODUCT_NO,表中可以有许多条目(因为索引中的该值将有很多条目)