SQL Server:唯一约束生成唯一键和唯一索引。

3
我有两个表:
attCatAppSet 和 attCatAppSet_translation
我在这两个表上应用了一个唯一约束,约束了2个列(它们不是主键),以便列对值不能重复。
GO
ALTER TABLE attCatAppSet
ADD CONSTRAINT UQ_category_id_setOrder 
UNIQUE(category_id, setOrder)
GO


GO
ALTER TABLE attCatAppSet_translation
ADD CONSTRAINT UQ_siteLanguage_id_attCatAppSet_id 
UNIQUE(siteLanguage_id, attCatAppSet_id)
GO

结果:查看对象资源管理器,我得到了两种不同的命令实现。

在attCatAppSet表上,有一个唯一索引约束。

在attCatAppSet_translation表上,有一个唯一索引和唯一键约束。

如果我调用相同的方法,则会显示相同的内容。

GO
sp_helpIndex attCatAppSet
GO
sp_helpIndex attCatAppSet_translation

enter image description here

  • 为什么我有两个不同的查询实现方式?
  • 这两种结果有什么区别?

乍一看,siteLanguage_id具有外键约束,而setOrder则没有。 - Rahul Vijay Dawda
两个约束条件至少有一个外键列,但这不应该是问题。 - Carlo Luther
1个回答

3
您在表格attCatAppSet中的约束包含了setOrder字段,这个字段并不是一个外键。因此,在attCatAppSet中你的外键只有category_id,也被显示为外键。但是你的约束UNIQUE(category_id, setOrder)需要联合唯一索引category_idsetOrder,所以这个索引被创建了,并被显示为普通索引(而非外键)。
外键用于定义表之间的关系。看起来你在创建这些约束之前已经创建了关系。(例如:您已经在attCatAppSet_translationsiteLanguage表之间定义了关系等等)
约束attCatAppSet_translation包含两个外键,因此它被显示为具有以下含义的键:attCatAppSet_translation表仅包含siteLanguageattCatAppSet的唯一组合。
只创建了两个联合唯一索引。SQL Server创建的这两个索引在功能上是等价的,只是显示的图标不同而已。这只是有关数据库模型在SQL Server Management Studio中如何记录的问题。
更多信息请参见这里这里

唯一约束是ANSI SQL定义的一部分,定义唯一约束是定义数据库逻辑设计的一部分。

从性能角度来看,对于查询优化器,唯一约束和唯一索引是相同的,使用其中的任何一个都不会带来性能上的好处。


1
因此,可以使用以下方式实现“相同”的结果:CREATE UNIQUE INDEX [UQ_category_id_setOrder] ON [dbo].[attCatAppSet] ( [category_id] , [setOrder] ) ? - Carlo Luther
2
@Luther,外键可以绑定到主键、唯一约束或唯一索引。只要这些与外键具有相同的列,就可以使用其中任何一个,但如果您有冗余索引,则无法直接控制使用哪个。请参见http://www.dbdelta.com/secrets-of-foreign-key-index-binding/。 - Dan Guzman
@VDohnal 和 Dan Guzman - SQL Server MVP,(我知道这是多余的)谢谢。 - Carlo Luther

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接