我有 2 个表:
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
- 我怎么会有 2 个不同的查询实现?
- 这两个结果有什么区别?
最佳答案
你在表中的约束attCatAppSet
包含 setOrder
字段,不是外键。所以你的外键在attCatAppSet
只是category_id
- 并且它也显示为外键。但是你的约束 UNIQUE(category_id, setOrder)
需要 category_id
的组合唯一索引和 setOrder
- 所以这个索引被创建并显示为普通索引(而不是外键)。
外键用于定义表之间的关系。在创建这些约束之前,您似乎已经创建了关系。 (例如,您已经定义了 attCatAppSet_translation
和 siteLanguage
表等之间的关系)
约束attCatAppSet_translation
包含两个外键,因此显示为具有以下含义的键:attCatAppSet_translation
表仅包含 siteLanguage
的唯一组合和 attCatAppSet
.
只创建了两个组合唯一索引。 这两个由 SQL Server 创建的索引在功能上是相同的,只是它们以不同的图标显示。它只是关于如何在 SQL Server Management Studio 中记录数据库模型。
UNIQUE constraints are part of the ANSI SQL definition and defining UNIQUE constraints is part of defining a database's logical design.
From a performance standpoint, UNIQUE constraints and unique indexes are effectively the same to the query optimizer and you will not see any performance benefit to using one vs the other.
关于sql-server - sql server : Unique constraint generates unique key and unique index,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26177412/