MySQL中的唯一约束及其空的详细解决方案

MySQL中的唯一约束及其空的详细解决方案
前言

以前的要求,在一个简化的描述中,是接受来自其他MQ组的消息,然后在数据库中插入一条记录。为了防止它们重复消息并插入多个重复记录,将一个唯一的索引添加到表中的几个列中。
创建唯一索引的数据idx_un_loan_plan_app(A,B,C);
此时,a、b和c三列不允许为空,唯一性约束也可以工作。
后来,由于需求的变化,先前的唯一性约束被修改了,并且增加了一个列(至于为什么不添加它)。
修改表的数据
idx_un_loan_plan_app下降指数,
添加独特的关键` idx_un_loan_plan_app `(A,B,C,D);
新增加的D是一个类型的日期,并允许为空,默认的值为空。默认值是空的,考虑到并不是所有的记录这段时间。如果是强制设定一个魔法值(如'1970-01-01 08:00:00)作为默认值,这看起来很奇怪。

在蓝色之后,这是个问题,加上D,唯一性约束基本无效。
插入数据(A,B,C,D)值(1,2,3,null);——好
插入数据(A,B,C,D)值(1,2,3,null);——好
插入数据(A,B,C,D)值(1,2,3,null);——好
上面的三个SQL可以成功执行,数据库中会有很多记录。

后来发现,MySQL官方文档已经清楚地说明了这一点,唯一的索引是允许多个空值存在。
惟一索引创建一个约束,使得索引中的所有值必须是明确的。如果试图添加与现有行匹配的键值,则会出现一个错误。对于所有引擎,惟一索引允许包含空值的列的多个空值。
从下表中可以看出,无论采用哪种存储引擎,在生成唯一密钥时都允许使用多个null。

想想看,事实上,这很合理。毕竟,在MySQL中,null表示未知。在SQL中,任何值到null的返回值都是null,而不是true,即使NULL到null的比较也返回null。

所以它只能解决。解决方法也很简单粗暴,直接在线数据刷,1970-01-01 08:00:00作为默认值,然后列允许空,呵呵。

很多人已经在MySQL的官方网站上讨论过这个问题。有些人认为这是MySQL的错误,而另一部分则是带有链接的特性。

MySQL的错误:# 8173:唯一索引允许重复使用空值

总结

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有任何疑问,您可以留言交流,谢谢您的支持。

tag:解决方案约束详细电脑软件mysql

相关内容