【问题标题】:UNIQUE argument for INDEX creation - what's for?INDEX 创建的唯一参数 - 有什么用?
【发布时间】:2011-04-17 11:29:52
【问题描述】:

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

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

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

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

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

那么,索引的唯一参数是什么?
除了混淆基本概念定义 [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?

【问题讨论】:

    标签: sql sql-server tsql indexing unique-index


    【解决方案1】:

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

    例子:

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

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

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

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

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

    【讨论】:

    • @vgv8:这不是重新措辞,这是一个完全不同的问题。 (我也对猜谜游戏不感兴趣,再见)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      ORDER_NO     INTEGER
      LINE_NO      INTEGER
      PRODUCT_NO   INTEGER
      QUANTITY     DECIMAL
      

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

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

      【讨论】:

        【解决方案4】:

        UNIQUE 索引子句实际上只是 SQL Server 和其他一些 DBMS 中的一种语法怪癖。在标准 SQL 中,唯一性约束是通过使用 PRIMARY KEY 和 UNIQUE CONSTRAINT 语法实现的,而不是通过索引(标准 SQL 中没有索引)。

        SQL Server 内部用来实现唯一性约束的机制称为唯一性索引。每当您创建 PRIMARY KEY 或 UNIQUE 约束时,都会自动为您创建唯一索引。由于 SQL Server 开发团队最熟悉的原因,他们决定将 UNIQUE 关键字作为 CREATE INDEX 语法的一部分公开,即使约束语法做同样的工作。

        为了清晰和标准支持,我建议您尽可能避免显式创建 UNIQUE 索引。请改用 PRIMARY KEY 或 UNQIUE 约束语法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-03
          • 1970-01-01
          • 2013-06-30
          • 2017-06-24
          • 1970-01-01
          • 2017-10-12
          • 1970-01-01
          • 2018-11-17
          相关资源
          最近更新 更多