2

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

据我了解,非聚集索引包含一个书签,一个指向行的指针,它应该是唯一的以区分非唯一行,
因此确保非聚集索引是唯一的?
正确的?

那么,我是否理解非唯一索引只能在聚集表上?自从

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

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

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


更新:
这又是同样的陷阱——根据未定义的术语解释已经多次解释的东西,将所有解释转换为永无止境的猜谜游戏。
请参阅我的子问题 [4],这实际上是对同一问题的重新措辞。


更新 2:
问题在于不明确、缺乏定义或在不恰当的上下文中不恰当地使用术语。如果索引被定义为服务于(查找和)识别/指向真实数据的结构,那么非唯一或 NULL 索引没有任何意义。再见


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

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

[3]
唯一索引还是唯一键?
唯一索引还是唯一键?

[4]
什么是索引,非聚集索引可以是非唯一的吗?
什么是索引,非聚集索引可以是非唯一的吗?

4

4 回答 4

6

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

例子:

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

假设登录名默认由名字+姓氏的第一个字母生成。

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

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

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

于 2010-09-26T18:04:29.003 回答
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 约束语法。

于 2010-09-29T19:52:31.300 回答
0

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

于 2010-09-26T18:06:39.670 回答
0

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

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

例如,考虑一个订单项目表:

ORDER_NO     INTEGER
LINE_NO      INTEGER
PRODUCT_NO   INTEGER
QUANTITY     DECIMAL

- 在 ORDER_NO 和 LINE_NO 上具有唯一索引,在 PRODUCT_NO 上具有非唯一索引。

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

于 2010-09-27T12:29:11.840 回答