你的位置:首页 > 数据库

[数据库]又来说一下顺序~关于唯一索引和唯一约束的顺序


上次说了同一个对象里面不同触发器的执行顺序。今天我也想分享一些我在同一个表里面,建上不同的唯一约束,不同的唯一索引,看下结果会怎样

首先简单建个测试表,不多,就4列

CREATE TABLE AAA3 (ID INT IDENTITY(1,1),Col1 VARCHAR(50),Col2 VARCHAR(50),Col3 VARCHAR(50))

情况1:然后往Col1 都添加上唯一索引和唯一约束。然后插入同样的数据,看下提示信息报那个先

CREATE UNIQUE INDEX UQ_AAA3_Col1 ON AAA3(Col1)ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col1_1 UNIQUE(Col1)INSERT INTO dbo.AAA3    ( Col1, Col2, Col3 )VALUES ( N'1', N'',N'' )GO 2开始执行循环(1 行受影响)消息 2601,级别 14,状态 1,第 9 行不能在具有唯一索引“UQ_AAA3_Col1”的对象“dbo.AAA3”中插入重复键的行。重复键值为 (1)。语句已终止。** 在执行批处理期间遇到错误。正在继续。批处理执行已完成 2 次。

出错是肯定的,但是可以看到,出错信息是显示唯一索引 UQ_AAA3_Col1 而并非唯一约束创建的索引 UQ_AAA3_Col1_1 。这里大概可以知道是在同一个字段里面比较,唯一索引比唯一约束要优先。(当然谁那么无聊……)

情况2:然后我尝试了一下在不同的列上面建唯一约束和唯一索引,看下是哪个比较优先,用在本例子,就是 Col2 创建唯一约束, Col3 创建唯一索引

ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col2_1 UNIQUE(Col2) CREATE UNIQUE INDEX UQ_AAA3_Col3 ON AAA3(Col3)INSERT INTO dbo.AAA3    ( Col1, Col2, Col3 )VALUES ( N'2', N'',N'' )消息 2627,级别 14,状态 1,第 9 行违反了 UNIQUE KEY 约束“UQ_AAA3_Col2_1”。不能在对象“dbo.AAA3”中插入重复键。重复键值为 ()。

确实报唯一索引的抛出出的错。(我怀疑过,是因为Column_id 前后的关系吗?然而不是,即使我在Col2 建唯一索引,Col3 建唯一约束,结果也是一样。唯一约束的判定优先)。

情况3 :将情况2 的约束索引+情况1 的唯一索引都干掉,新增一个组合唯一索引查看效果。把Col1,Col2 组成组合唯一约束,看下效果是哪个好

ALTER TABLE dbo.AAA3 ADD CONSTRAINT UQ_AAA3_Col1_2 UNIQUE(Col1,Col2)INSERT INTO dbo.AAA3    ( Col1, Col2, Col3 )VALUES ( N'1', N'',N'' )消息 2627,级别 14,状态 1,第 9 行违反了 UNIQUE KEY 约束“UQ_AAA3_Col1_2”。不能在对象“dbo.AAA3”中插入重复键。重复键值为 (1, )。

这个例子看出,符合唯一约束优先检测~so,我想到的情况就是这个样纸了~

 

PS:有时觉得研究这些问题可能是没有什么实际应用场景~但是还是需要脑洞一下了~聊此一笑呵呵