MySQL中唯一性约束与零的示例分析

  介绍

这篇文章给大家分享的是有关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中唯一性约束与零的示例分析

细想想,其实也蛮合理,毕竟在MySQL中认为零代表着“未知”。在SQL中,任何值与零的比较返回值都是零而不是真的,就算零与零的比较也是返回零。

所以只能修复了……解决办法也蛮简单粗暴的,直接把线上数据刷了一遍,将“1970-01-01 08:00:00”作为默认值,然后把那列改为不允许为空的了,咳咳。

MySQL官网上也有蛮多人讨论过这个问题,一部分人认为这是MySQL的错误,另一部分则认为是一个功能。

感谢各位的阅读!关于“MySQL中唯一性约束与零的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

MySQL中唯一性约束与零的示例分析