【问题标题】:Unique index or unique key?唯一索引还是唯一键?
【发布时间】:2011-04-17 05:08:24
【问题描述】:

唯一索引和唯一键有什么区别?

【问题讨论】:

    标签: sql-server database-design unique-constraint unique-index


    【解决方案1】:

    独特之处不在于差异所在。 index和key不是一回事,没有可比性。

    键是一个数据列或多个列,它们通过约束强制唯一,无论是主键还是显式定义的唯一约束。而索引是一种用于存储数据位置以便更快检索的结构。

    来自文档:

    Unique Index

    在表上创建唯一索引或 看法。唯一索引是其中的一个 不允许有两行 相同的索引键值。一个集群 视图上的索引必须是唯一的

    Unique key (Constraint)

    您可以使用 UNIQUE 约束来制作 确保没有重复值 在特定的列中输入 不参与主键。 尽管 UNIQUE 约束和 PRIMARY KEY 约束强制 唯一性,使用 UNIQUE 约束 而不是 PRIMARY KEY 约束 当你想强制执行 列或组合的唯一性 列,这不是主要的 键。

    【讨论】:

      【解决方案2】:

      这个MSDN article comparing the two is what you're after。术语是这样的,“约束”是 ANSI,但在 SQL Server 中,您不能禁用唯一约束...

      在大多数情况下,没有区别 - 约束是作为索引实现的。 MSDN 文章支持这一点——区别在于元数据,例如:

      • 调整填充因子
      • INCLUDE 提供更高效的覆盖索引(复合约束)
      • 过滤索引就像对行子集的约束/忽略多个空值等。

      【讨论】:

      • “约束被实现为隐蔽的索引”——绝对正确,在任何情况下如果没有索引就不可能有效地执行。
      • @ReversedEngineer 我想如何 SQL Server 选择实现一个独特的约束 完全是一个内部实现细节。它甚至可以选择执行表扫描。或者可能会决定,既然你已经有一个涵盖它需要的索引,它就会这样做。如果您可能删除该其他索引,它可能会创建自己的索引。关于唯一约束,你真正能保证的是它是一个约束。而如果你创建一个唯一索引,你肯定会得到一个索引。
      【解决方案3】:

      “唯一键”是一个重言式。键(又名“候选键”)是数据库的逻辑特征 - 一种强制执行表中一组属性的唯一性的约束。

      索引是一种物理级别的功能,旨在以某种方式优化性能。索引的种类很多。

      【讨论】:

        【解决方案4】:

        唯一键:这是对数据库施加限制的约束。该限制是它不允许重复值。例如,如果你想选择一列作为主键,它应该是 NOT NULL & UNIQUE。

        唯一索引:它是一种在对数据库执行查询时提高性能的索引。在唯一索引中,它也不允许索引中的重复值。即,没有两行将具有相同的索引键值。

        【讨论】:

          【解决方案5】:

          以下是几个主要区别:

          目的:

          • 唯一键:保证表级数据的完整性,使得表中不能输入重复。不用于查询计划,不影响查询速度。 (与主键的用途不同,主键唯一标识每条记录,用于更新/删除等数据操作。在复杂的表中,唯一键可以是多列的组合,使用唯一键将效率低下识别交易记录。因此,主键是识别表中特定记录的快速方法,而唯一键保证没有两条记录具有相同的键属性。)
          • 唯一索引:保证数据在索引级别的唯一性,不能保证表级的唯一性,例如在过滤索引的情况下。用于查询计划和获取数据,从而根据使用/查询的列加快查询速度。

          过滤选项:

          • 唯一键:过滤选项不可用
          • 唯一索引:过滤选项可用

          存储选项:

          • 唯一键:仅文件组
          • 唯一索引:文件组或分区

          图标:

          • 唯一键:图标为垂直键 []
          • 唯一索引:图标是 b-tree []

          【讨论】:

            【解决方案6】:

            键(又名关键字)和索引都是表行的标识符。
            虽然索引是并行标识结构,包含一个指向被标识行的指针,而键是原位字段成员。

            作为标识符的键意味着唯一性(约束)和 NOT NULL(约束)。 NULL 作为标识符没有意义(因为 null 不能识别任何东西)以及非唯一的识别值。
            非聚集索引可以包含真实数据,不作为真实数据的标识符,因此是非唯一的[1]

            不幸的是,键或索引(标识符)是由约束(规则或限制)调用的,这里的大多数先前答案都遵循。

            键用于以下上下文:

            • alternate aka secondary aka 候选键,可以是多个
            • 复合键(几个字段组合)
            • 主键(superkey),自然键或代理键,只有一个,真正用于参照完整性
            • 外键

            外键是另一个表中的键(它是主键),甚至不是他们经常引用的键。这种使用是通过将“外键约束”术语的快捷方式混淆为“外键”来解释的。

            主键约束实际上意味着 NOT NULL 和 UNIQUE 约束 + 引用的列(或组合列)是标识符,不幸的是被“主键”或“主键约束”取代,而这两者都不能被调用(主键)约束或仅(主)键。


            更新:
            我的相关问题:
            [1]
            UNIQUE argument for INDEX creation - what's for?

            【讨论】:

              【解决方案7】:

              功能或多或少相同,这取决于您的用例。

              假设您希望允许基于 CUSTOMER_ID 和 TEAM_NAME 的重复行。

              在这种情况下,您可以同时使用:

              • 唯一索引idx_customer_id_name (CUSTOMER_ID,TEAM_NAME)
              • 唯一键unique_key_customer_id_name (CUSTOMER_ID,TEAM_NAME)

              但您应该考虑根据 CUSTOMER_ID AND TEAM_NAME 获取记录的频率。如果它更多,那么您应该使用唯一索引,因为它有助于更​​快地检索记录,否则您应该使用唯一键,因为它可以防止无意中听到基于索引的提取。

              【讨论】:

                猜你喜欢
                • 2010-10-03
                • 2021-03-23
                • 1970-01-01
                • 2011-12-04
                • 2014-11-28
                • 2012-05-03
                • 1970-01-01
                • 2010-09-26
                • 1970-01-01
                相关资源
                最近更新 更多