这篇文章给大家分享的是有关MySQL中唯一性约束与零的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
前言
之前做的一个需求,简化描述下就是接受其他组的MQ的消息,然后在数据库里插入一条记录。为了防止他们重复发消息,插入多条重复记录,所以在表中的几个列上加了个唯一性索引。
CREATE UNIQUE INDEX IDX_UN_LOAN_PLAN_APP 提醒testTable (A, B, C);
这时A, B, C三列都是不允许NULL值的,唯一性约束也的是工作。
后来由于需求的变化,修改了以前的唯一性约束,又多加了一列。(至于为什么加就不赘述了)。
ALTER TABLE testTable DROP INDEX  IDX_UN_LOAN_PLAN_APP, ADD UNIQUE  KEY “IDX_UN_LOAN_PLAN_APP”, (A, B, C, D);
新加的D是类型是datetime,允许为NULL,默认值为NULL。之所以默认值为NULL,是考虑到不是所有记录都有这个时间的,如果强行设置一个魔法值(比如& # 39;1970-01-01 08:00:00”)当做默认值,看起来很奇怪。
蓝后……就出问题了。加了D之后,唯一性约束基本就失效了。
Insert into testTable (A, B, C, D), VALUES (1、2、3, NULL);,——安康;好吧 Insert into  testTable (A, B, C, D), VALUES (1、2、3, NULL);——背后,好吧 Insert into  testTable (A, B, C, D), VALUES (1、2、3, NULL);,——安康;好
上面的三条SQL都是可以执行成功的,数据库中会有多条一样的记录。可按照我们以前的构想,在执行后两条SQL时应该抛出的重复键# 39;的异常的。
后来查了一下,才发现其实MySQL官方文档上已经明确说了这一点,唯一性索引是允许多个NULL值的存在的:
A UNIQUE index creates A constraint such that all values 拷贝,index must be 不同只An error occurs if 你try 用add A new row with A key value that matches An existing 行只For all 引擎,A UNIQUE index allows multiple NULL values For columns that 还要contain NULL。
从下表中也可以看出来不管是采用什么类型的存储引擎,在建立唯一键的时候都是允许多个空存在的....
细想想,其实也蛮合理,毕竟在MySQL中认为零代表着“未知”。在SQL中,任何值与零的比较返回值都是零而不是真的,就算零与零的比较也是返回零。
所以只能修复了……解决办法也蛮简单粗暴的,直接把线上数据刷了一遍,将“1970-01-01 08:00:00”作为默认值,然后把那列改为不允许为空的了,咳咳。
MySQL官网上也有蛮多人讨论过这个问题,一部分人认为这是MySQL的错误,另一部分则认为是一个功能。
感谢各位的阅读!关于“MySQL中唯一性约束与零的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!