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

Gen*_*нин 2 sql t-sql sql-server indexing unique-index

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

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

那么,我是否理解无唯一索引只能在聚簇表上?以来

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

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

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


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


更新2:
问题是模糊不清,缺乏定义或在不正确的上下文中不恰当地使用术语.如果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]
唯一索引或唯一密钥?
唯一索引或唯一键?

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

Pis*_*3.0 6

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

例:

 Firstname  | Lastname  | Login
================================
 Joe        | Smith     | joes
 Joe        | Taylor    | joet
 Susan      | Smith     | susans
Run Code Online (Sandbox Code Playgroud)

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

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

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

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