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

标签 sql sql-server tsql indexing unique-index

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

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

那么,我是否理解非唯一索引只能在聚簇表上?因为

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

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

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


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


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


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

[2]
创建表 (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?

最佳答案

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

例子:

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

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

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

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

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

关于sql - INDEX 创建的 UNIQUE 参数 - 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3799095/

相关文章:

sql - Oracle - regexp_replace 用逗号分隔的字符串中的空值

具有两个条件的 SQL 查询

javascript - 如何更改 "with '

sql - 是什么导致了这种奇怪的 SQL 行为?

c# - 根据循环更改参数值

mysql - docker-compose mysql init sql没有执行

sql - 在 Rails 中执行 destroy_all 的更有效方法?

MySQL:如何填充表以用现有数据填充缺失的行

c# - 如何使用 C# 运行 SQL 事务(使用 TSql110Parser)

sql-server - SQL Server - 将无效值转换为 int