我们有两列is_unique
,其中is_unique_constraint
有独特的约束sys.indexes
,我想根据这两列澄清一些概念
- 两种类型的索引的创建语句除了
fill factor
属性值之外是相同的,还是我遗漏了什么? - 如果语句 1 为真,那么为什么我们在 sys.indexes 中有两列用于唯一约束?
何时
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]
为什么呢?
我们在哪里使用唯一索引以及在哪里使用唯一约束,最佳实践是什么?
事实上,唯一约束和唯一索引之间没有实际区别。
sys.objects
,你会发现唯一约束被列为一个约束对象,查询时可以找到它的相关索引,并sys.indexes
在其中标记。另一方面,对于唯一索引值将为零 (0)。is_unique = 1
is_unique_constraint = 1
is_unique_constraint
FILLFACTOR, PAD_INDEX, IGNORE_DUP_KEY, DROP_EXISTING, and STATISTICS_NORECOMPUTE
.is_unique_constraint = 1
,必须通过 DROP CONSTRAINT 语法而不是 DROP INDEX 删除它,因为这样的索引与唯一约束(对象)相关联,因此必须删除 CONSTRAINT 并且索引将自动删除。作为最佳实践,如果需要唯一性,则始终应用唯一约束,而不是仅创建唯一索引。这样您就不会意外删除唯一索引。此外,您可以轻松记录所有应用的约束。
http://technet.microsoft.com/en-us/library/aa224827(v=sql.80).aspx
除了 aasims 的回答之外,这里唯一的主要区别是 a不是
Unique Index
数据库对象。而 a是一个对象。unique Constraint
但是除此之外没有其他主要区别:
编辑:
为什么要使用唯一索引与约束,最佳实践是什么?
这里没有一种适合所有最佳实践的方法。一个主要原因(至少)。唯一约束仅允许列中有一个空值。但是,您可以在不包含值的情况下创建唯一索引
null
:这将创建索引,但仅在电子邮件列上的值不为空的情况下创建。