当我希望列具有不同的值时,我可以使用约束
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);
具有唯一约束的列似乎是唯一索引的良好候选者.
是否有任何已知的原因使用唯一约束而不是使用唯一索引?
解决方法
在引擎盖下,唯一约束的实现方式与唯一索引相同 – 需要一个索引来有效地满足强制执行约束的要求.即使索引是作为UNIQUE约束的结果创建的,如果查询计划程序将其视为接近给定查询的最佳方式,它也可以像使用任何其他索引一样使用它.
因此,对于支持这两种功能的数据库,选择使用哪种功能通常会归结为首选的样式和一致性.
如果你打算使用索引作为索引(即你的代码可能依赖于对该字段的搜索/排序/过滤来快速),我会明确地使用唯一索引(并注释源)而不是约束来实现clear – 这样如果在应用程序的后续版本中更改了唯一性要求,您(或其他一些编码人员)将知道确保使用非唯一索引代替唯一索引(仅删除唯一约束将删除完全索引).还可以在索引提示中命名一个特定的索引(即WITH(INDEX(ix_index_name)),我不认为这是在幕后创建的用于管理唯一性的索引,因为您不太可能知道它的名称.
同样,如果您只需要将唯一性强制作为业务规则而不是需要搜索或用于排序的字段,那么我将再次使用约束,以便在其他人查看您的表定义时使预期用途更加明显.
请注意,如果在同一个字段上同时使用唯一约束和唯一索引,则数据库将不够明亮以查看重复,因此最终将使用两个索引,这将消耗额外的空间并减慢行插入/更新.