Gen*_*нин 2 sql t-sql sql-server indexing unique-index
为什么INDEX创建语句具有UNIQUE参数?
据我所知,非聚集索引包含一个书签,一个指向行的指针,它应该是唯一的,以区分甚至非唯一的行,
从而确保非聚集索引是唯一的?
正确?
那么,我是否理解无唯一索引只能在聚簇表上?以来
由于"聚集索引的底部或叶子级别包含表的实际数据行"[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]
什么是索引,非聚集索引可以是非唯一的?
什么是索引,非聚集索引可以是非唯一的?
虽然非唯一索引足以区分行(如您所述),但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)
.现在我们有两个用户名相同的用户 - 可能是坏事.
现在假设我们UNIQUE
在Login
列上有一个索引- 在允许插入新行之前,数据库将检查是否已存在具有相同数据的其他行.换句话说,joes
将拒绝插入另一个的尝试,因为该数据在该行中不再是唯一的.
当然,你可以在多列上有唯一的索引,在这种情况下,数据的组合必须是唯一的(例如,一个唯一的索引Firstname,Lastname
将很乐意接受一行(Joe,Badzhanov)
,因为该组合尚未在表中,但会拒绝第二排用(Joe,Smith)
)