代码之家  ›  专栏  ›  技术社区  ›  My Other Me

唯一约束和唯一索引之间的区别是什么

  •  10
  • My Other Me  · 技术社区  · 15 年前

    以下两种说法有什么区别?

    alter table [dbo].[Demo] add constraint [UC_Demo_Code] unique ( [Code] )
    go
    create unique nonclustered index [UK_Demo_Code] on [dbo].[Demo] ( [NB_Code] )
    go
    

    约束是否有一个索引来帮助它强制唯一性,或者将在每次插入/更新时执行表扫描?

    3 回复  |  直到 10 年前
        1
  •  10
  •   Philip Kelley    15 年前

    “逻辑”效果是相同的——只有唯一的值可以加载到表中。(值得一提的是,如果列可以为空,则只能插入一行空值。)

    物理效果是一样的——在表上构建了一个惟一的索引。它可以是簇状的,也可以是非簇状的。

    唯一真正的区别在于元数据,即系统表中存储的描述数据库的信息。第一种方式是,在内部将其记录为索引,第二种方式是,将其记录为约束—即使净效果相同。这意味着,归根结底,唯一的区别是创建和更改它所需的代码。

    (从2005年到现在的sql 7.0都是这样,如果他们在2008年改变了它,我会非常惊讶)。

        2
  •  0
  •   Tom Cabanski    15 年前

    请原谅我的第一个错误回答。唯一约束与唯一索引相同。在封面下,它确实创建了一个索引。

        3
  •  0
  •   Nima    10 年前

    你可以查一下 Unique Constraints and Unique Indexes 以作比较。

    本文的结论是,唯一约束和唯一索引之间没有实际的区别,只是唯一约束在数据库中也列为约束对象。由于无法禁用唯一约束,因此具有唯一约束的状态不会使唯一约束具有唯一索引之外的任何其他行为。但是,有几个索引创建选项对创建唯一约束的alter table命令不可用。