我有两张桌子:
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
答案 0 :(得分:3)
表attCatAppSet
中的约束包含setOrder
字段,不是外键。所以attCatAppSet
中的外键只是category_id
- 它也显示为外键。但是您的约束UNIQUE(category_id, setOrder)
需要组合category_id
和setOrder
的唯一索引 - 因此创建了此索引并显示为普通索引(而不是外键)。
外键用于定义表之间的关系。在创建theese约束之前,您似乎已经创建了关系。 (例如,您已经定义了attCatAppSet_translation
和siteLanguage
表等之间的关系。)
约束attCatAppSet_translation
包含两个外键,因此它显示为具有以下含义的键:attCatAppSet_translation
表仅包含siteLanguage
和attCatAppSet
的唯一组合。
仅创建了两个组合的唯一索引。 SQL Server创建的两个索引在功能上是等效的,只有它们以不同的图标显示。它只是关于如何在SQL Server Management Studio中记录数据库模型。
UNIQUE约束是ANSI SQL定义和定义的一部分 UNIQUE约束是定义数据库逻辑设计的一部分。
从性能角度来看,UNIQUE约束和唯一索引 与查询优化器实际上是相同的,你不会看到 使用one vs另一种的任何性能优势。