sql-server - sql server : Unique constraint generates unique key and unique index

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

我有 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上,有唯一索引和唯一键约束。

enter image description here

如果我调用同样的东西:

GO
sp_helpIndex attCatAppSet
GO
sp_helpIndex attCatAppSet_translation

enter image description here

  • 我怎么会有 2 个不同的查询实现?
  • 这两个结果有什么区别?

最佳答案

你在表中的约束attCatAppSet包含 setOrder字段,不是外键。所以你的外键在attCatAppSet只是category_id - 并且它也显示为外键。但是你的约束 UNIQUE(category_id, setOrder)需要 category_id 的组合唯一索引和 setOrder - 所以这个索引被创建并显示为普通索引(而不是外键)。

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

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

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

更多信息 herehere .

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/

相关文章:

sql-server - 启用全文搜索时如何更改表?

sql-server - 如何在没有文件流的情况下备份和恢复数据库

sql - 选择 'EXIST' 或 'NotExist' 作为列

postgresql - 插入记录违反了 PostgreSQL 中的两个唯一索引。首先检查哪一个?

sqlite - 我是否正确定义了所有 key ?我需要添加索引吗?

sql - 插入后获取新ID

sql-server - 无主键(唯一索引)的事务复制

sql-server - Management Studio 如何知道保存我的 T-SQL 注释?

sql - 如何在 SQL Server 中禁用表或触发器级别的触发器嵌套?

mysql - 使用外列的唯一多列键