当其中一个字段为NULL时,MySQL错误地允许重复条目

a.r*_*ing 11 php mysql sql mysqli

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

我添加了一个独特的约束,如下所示:

ALTER TABLE mytable ADD UNIQUE INDEX(field1,field2,field3);
Run Code Online (Sandbox Code Playgroud)

但是,我完全能够添加以下行而不会生成任何错误.我想为此生成"重复"错误,但它不会:

INSERT INTO mytable VALUES (NULL,3,NULL)
INSERT INTO mytable VALUES (NULL,3,NULL)
Run Code Online (Sandbox Code Playgroud)

如果所有字段都具有非NULL值,它只会生成"重复"错误 - 例如,

INSERT INTO mytable VALUES (2,3,4)
INSERT INTO mytable VALUES (2,3,4)
Run Code Online (Sandbox Code Playgroud)

即使一个(或多个)字段具有NULL值,我如何告诉MySQL生成"重复"错误?

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

val*_*lex 5

您无法比较NULL(如果您将任何内容与NULL进行比较,即使NULL = NULL,结果也始终如此FALSE),这种行为会记录在MySQL ref中.

UNIQUE索引创建一个约束,使索引中的所有值必须是不同的.如果您尝试添加具有与现有行匹配的键值的新行,则会发生错误.对于所有引擎,UNIQUE索引允许可以包含NULL的列的多个NULL值.

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