【问题标题】:What is the difference between Unique Key and Index with IsUnique=Yes?IsUnique=Yes 的唯一键和索引有什么区别?
【发布时间】:2009-02-19 11:39:58
【问题描述】:

我有一个带有主键的表,但我希望限制另外两列,这样可以保证两者的组合始终是唯一的。

(一个愚蠢的例子:在 BOOKS 表中,IBAN 列是主键,但 Title 和 Author 列的组合也应该始终是唯一的。)

在 SQL Server Management Studio 中,可以创建一个新索引并将 IsUnique 设置为 Yes,或者我可以创建一个新的唯一键。

这两种方法有什么区别,哪一种最适合哪些目的?

【问题讨论】:

  • 以防万一:如果您需要允许多行为 NULL 但任何非 NULL 行必须是唯一的:要么使用触发器强制执行,要么使用具有唯一索引的视图 - 创建视图xxx AS SELECT Title, Author FROM Books WHERE (Title + Author) IS NOT NULL 然后在该视图上创建索引
  • 感谢 Kirsten,这是有用的信息!

标签: sql-server database


【解决方案1】:

创建一个 UNIQUE 约束是对规则的更清晰的陈述。索引的 IsUnique 属性是一个实施细节 - 如何 实施规则,而不是 什么 规则。效果是一样的。

【讨论】:

  • @pylover:在某些情况下,约束(例如外键或非空)可以通过向优化器提供原本不会有的有用信息来提高性能。在唯一性的情况下,我想约束和索引之间没有区别,但不是 100% 确定。
【解决方案2】:

两者有明显区别。 唯一约束定义了哪些列组合必须是唯一的。 唯一索引只是确保上述内容始终有效的一种方式。 但是可能有一个支持唯一约束的非唯一索引。 (如果约束是可延迟的 = 仅在提交时有效,但允许在事务中间中断)

【讨论】:

    【解决方案3】:

    让您知道,当您创建唯一约束时,SQL Server 将在后台创建索引

    【讨论】:

      【解决方案4】:

      我刚刚发现一个困难的方法是,在 SSMS 中,唯一键的脚本默认设置为 true,但索引的脚本设置为 False。当我使用 SSMS 中的 Script Table As 上下文菜单时,我没有得到我的唯一索引。

      此外,如果类型设置为唯一键,则无法更改“忽略重复键”设置。首先,您将类型从唯一键更改为索引,然后您可以将忽略重复键设置为 true。

      【讨论】:

        【解决方案5】:

        唯一索引是唯一键。

        【讨论】:

          【解决方案6】:

          我不认为它们之间有任何区别,但是使用唯一索引,我们可以有两个好处,因为列已经是唯一的并且上面还有索引,所以我会更快地搜索。所以使用唯一索引更有好处。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-12
            • 1970-01-01
            相关资源
            最近更新 更多