一尘不染

什么时候应该使用唯一约束而不是唯一索引?

sql

当我希望一列具有不同的值时,我可以使用约束

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go

或者我可以使用唯一索引

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);

具有唯一约束的列似乎是唯一索引的良好候选者。

是否有任何已知的理由使用唯一约束而不是使用唯一索引?


阅读 87

收藏
2022-10-21

共1个答案

一尘不染

在引擎盖下,唯一约束的实现方式与唯一索引相同 - 需要索引来有效地满足强制执行约束的要求。即使索引是作为 UNIQUE 约束的结果创建的,如果查询规划器认为它是处理给定查询的最佳方式,它也可以像使用任何其他索引一样使用它。

因此,对于同时支持这两种功能的数据库,选择使用哪种功能通常归结为首选样式和一致性。

如果您打算将索引用作索引(即您的代码可能依赖于对该字段进行快速搜索/排序/过滤),我将明确使用唯一索引(并注释源)而不是约束来实现清楚 - 这样,如果在应用程序的后续版本中更改唯一性要求,您(或其他一些编码人员)将知道确保将非唯一索引放置在唯一索引的位置(只需删除唯一约束即可删除索引完全)。此外,可以在索引提示中命名一个特定的索引(即 WITH(INDEX(ix_index_name)),我认为这不是在幕后创建的用于管理唯一性的索引的情况,因为您不太可能知道它的名称。

同样,如果您只需要将唯一性作为业务规则而不是需要搜索或用于排序的字段,那么我将使用约束,再次使预期用途在其他人查看您的表定义时更加明显。

请注意,如果您在同一字段上同时使用唯一约束和唯一索引,则数据库将不够亮以查看重复项,因此您最终会得到两个索引,这将消耗额外空间并减慢行插入/更新速度。

2022-10-21