微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 当涉及的一个字段为NULL时,MySQL错误地允许重复条目

使用InnoDB / MySQLi,我有一个简单的表:mytable.该表有四个字段:id(primary,auto_inc),field1,field2,field3.所有这些都是BIGINT,除了id,可以是NULL.

我已经添加了如下所示的唯一约束:

ALTER TABLE mytable ADD UNIQUE INDEX(field1,field3);

但是,我完全可以添加以下行,而不会生成任何错误.我想为此产生一个“重复”错误,但它不:

INSERT INTO mytable VALUES (NULL,3,NULL)
INSERT INTO mytable VALUES (NULL,NULL)

如果所有字段都具有非NULL值,则它仅生成“重复”错误 – 例如,

INSERT INTO mytable VALUES (2,4)
INSERT INTO mytable VALUES (2,4)

如果一个(或多个)字段具有NULL值,那么我怎么能告诉MysqL生成“重复”错误

编辑:这是以前添加MysqL错误http://bugs.mysql.com/bug.php?id=25544

你不能比较NULL(如果你比较NULL甚至NULL = NULL,结果总是FALSE)这个行为记录在 MySQL ref.

A UNIQUE index creates a constraint such that all values in the index
must be distinct. An error occurs if you try to add a new row with a
key value that matches an existing row. For all engines,a UNIQUE
index permits multiple NULL values for columns that can contain NULL.

所以我认为唯一的方法是定义列NOT NULL或者在触发器中处理这个问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流程
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中APP的支付的配置与实现流程
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛,就离不开通讯了,然后我就想到了长连接。这里本人用的是GatewayWorker框架。
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中JSAPI的支付实现流程
服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用