• 又来说一下顺序~关于唯一索引和唯一约束的顺序


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

    首先简单建个测试表,不多,就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:有时觉得研究这些问题可能是没有什么实际应用场景~但是还是需要脑洞一下了~聊此一笑呵呵

  • 相关阅读:
    LVM详解
    redis数据类型
    radis数据库安装
    POJ3294 Life Forms 【后缀数组】
    BZOJ1076 [SCOI2008]奖励关 【状压dp + 数学期望】
    POJ2774 Long Long Message 【后缀数组lcp】
    POJ2406 Power Strings 【KMP 或 后缀数组】
    POJ3261 Milk Patterns 【后缀数组】
    BZOJ3289 Mato的文件管理 【莫队 + 树状数组】
    BZOJ2460 [BeiJing2011]元素 【线性基】
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5250479.html
Copyright © 2020-2023  润新知