为什么INDEX创建语句有UNIQUE参数?
据我所知,非聚集索引包含一个书签,一个指向行的指针,它应该是唯一的,以区分甚至非唯一的行,
所以确保非聚集索引是唯一的?
正确吗?
那么,我是否理解没有唯一索引只能在聚簇表上?从那以后
由于“聚集索引的底部或叶子级别包含表的实际数据行”[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?
答案 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,表中可以有许多条目(因为索引中的该值将有很多条目)