sys.indexes 中的 is_unique 列和 is_unique_constraint 列有什么区别

AA.*_*.SC 6 index sql-server sql-server-2008-r2

我们有两列is_uniqueis_unique_constraint唯一的约束sys.indexes,我想澄清一些基于这两列的概念

  1. 除了fill factor属性值之外,两种类型的索引的创建语句是相同的还是我遗漏了什么?
  2. 如果语句 1 为真,那么为什么我们在 sys.indexes 中有两列用于唯一约束?
  3. 何时is_unique=1 is_unique_constraint =0然后删除索引的语句是
    DROP INDEX [index name] ON [dbo].[TableName] WITH ( ONLINE = OFF )

    何时is_unique=1 is_unique_constraint =1然后删除索引的语句是
    ALTER TABLE [dbo].[TableName] DROP CONSTRAINT [IndexName]

    为什么呢?

  4. 我们在哪里使用唯一索引和唯一约束,最佳实践是什么?

Aas*_*lah 4

事实上,唯一约束和唯一索引之间没有实际区别。

  1. 查询时sys.objects会发现唯一约束被列为约束对象,查询时可以找到其相关索引,并sys.indexes在其中进行了标记。另一方面,对于唯一索引,值将为零 (0)。is_unique = 1is_unique_constraint = 1is_unique_constraint
  2. 创建唯一约束时,您可以使用填充因子选项,与唯一索引相比,您有更多选项,例如FILLFACTOR, PAD_INDEX, IGNORE_DUP_KEY, DROP_EXISTING, and STATISTICS_NORECOMPUTE.
  3. 唯一约束通过唯一索引来维护
  4. 就像默认值和主键一样,无法使用 NOCHECK 语法禁用唯一约束
  5. 要使用 删除唯一索引is_unique_constraint = 1,必须通过 DROP CONSTRAINT 语法而不是 DROP INDEX 来删除它,因为该索引与唯一约束(对象)关联,因此必须删除 CONSTRAINT,索引将自动删除。

作为最佳实践,如果需要唯一性,则始终应用唯一约束,而不是仅创建唯一索引。这样您就不会意外删除唯一索引。此外,您还可以轻松记录所有应用的约束。
http://technet.microsoft.com/en-us/library/aa224827(v=sql.80).aspx