上次说了同一个对象里面不同触发器的执行顺序。今天我也想分享一些我在同一个表里面,建上不同的唯一约束,不同的唯一索引,看下结果会怎样
首先简单建个测试表,不多,就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:有时觉得研究这些问题可能是没有什么实际应用场景~但是还是需要脑洞一下了~聊此一笑呵呵