【问题标题】:sql server: Unique constraint generates unique key and unique indexsql server:唯一约束生成唯一键和唯一索引
【发布时间】:2014-11-28 10:06:49
【问题描述】:

我有两张桌子:

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

结果:查看对象资源管理器,我得到了 2 种不同的命令实现。 在表 attCatAppSet 上,存在唯一索引约束。 在表 attCatAppSet_translation 上,存在唯一索引和唯一键约束。

如果我打电话,同样的事情会显示:

GO
sp_helpIndex attCatAppSet
GO
sp_helpIndex attCatAppSet_translation

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

【问题讨论】:

  • 乍一看,siteLanguage_id 有外键约束,而 setOrder 没有。
  • 两个约束都至少有一个 FK 列,但这应该不是问题。

标签: sql-server tsql unique-constraint unique-key unique-index


【解决方案1】:

您在表attCatAppSet 中的约束包含setOrder 字段,该字段不是外键。所以attCatAppSet 中的外键只是category_id - 它也显示为外键。但是您的约束 UNIQUE(category_id, setOrder) 需要 category_idsetOrder 的组合唯一索引 - 因此该索引已创建并显示为普通索引(而不是外键)。

外键用于定义表之间的关系。在创建这些约束之前,您似乎已经创建了关系。 (例如,您已经定义了 attCatAppSet_translationsiteLanguage 表之间的关系等)

约束attCatAppSet_translation 包含两个外键,因此显示为具有以下含义的键:attCatAppSet_translation 表仅包含siteLanguageattCatAppSet 的唯一组合。

仅创建了两个组合唯一索引。 SQL Server 创建的两个索引在功能上是相同的,只是它们用不同的图标显示。 它只是关于如何在 SQL Server Management Studio 中记录数据库模型。

更多信息herehere

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

从性能的角度来看,UNIQUE 约束和唯一索引 实际上与查询优化器相同,您不会看到 使用一个与另一个相比的任何性能优势。

【讨论】:

  • 因此可以通过以下方式获得“相同”结果:CREATE UNIQUE INDEX [UQ_category_id_setOrder] ON [dbo].[attCatAppSet] ( [category_id] , [setOrder] ) ?
  • @Luther,外键可能绑定到主键、唯一约束或唯一索引。可以使用与外键具有相同列的任何这些列,但如果您有冗余索引,则无法直接控制使用哪个列。见dbdelta.com/secrets-of-foreign-key-index-binding
  • @VDohnal 和 Dan Guzman - SQL Server MVP,(我知道这是多余的)谢谢。
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 2015-12-29
  • 2011-03-18
  • 2013-01-01
  • 1970-01-01
  • 2018-12-02
  • 2023-03-11
  • 2021-11-02
相关资源
最近更新 更多