回答

收藏

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

技术问答 技术问答 248 人阅读 | 0 人回复 | 2023-09-13

使用InnoDB / MySQLi,我有一个简单的表:mytable。该表有四个字段:id(伯,auto_inc)
% B. _1 i3 o3 w8 z,field1,。field2 field3他们都是BIGINT和,除了id,可以NULL。
; @& v5 v' n# D( t, r; b5 |我添加了一个独特的约束,如下所示:
) @. h8 L1 q( w+ uALTER TABLE mytable ADD UNIQUE INDEX(field1,field2,field3);5 O6 u7 x! S# i" X  ~) Q
但是,我完全能够添加以下行,而不会产生任何错误。我希望此生成“重复”错误,但不会:' B4 a6 g( @2 a4 U6 v- E% ?
INSERT INTO mytable VALUES (NULL,3,NULL)  u! x3 d# a0 y) z/ u% b/ b
INSERT INTO mytable VALUES (NULL,3,NULL); n% v& g) n7 _- v
如果所有字段都具有非NULL值,则只会生成“重复”错误-例如,3 ~: |" A) h$ G1 W, a
INSERT INTO mytable VALUES (2,3,4)
0 s! a% P: F+ F, K6 V  O. @INSERT INTO mytable VALUES (2,3,4)0 \4 ?! T5 A" A" G; h: ]/ C! @, {
即使一个(或多个)字段具有NULL值,我如何告诉MySQL生成“重复”错误?
7 [0 ?5 k+ U( N) l编辑: 这是以前作为“错误”添加到MySQL:http :
4 n! t1 Y$ d4 S" E; l0 L; K//bugs.mysql.com/bug.php?id=25544. Q' B: z! ^6 G- t! E' V$ z" a0 R- f, |
                . O' B# g5 l2 Z5 x4 h  ^
解决方案:) H+ t3 f% ]( m+ `7 a
                0 W; q0 |/ j4 V) L, y% F
! W0 A) g# C: h1 j3 q8 J

  q* t0 U  y- \                您无法比较NULL(如果您将任何与NULL进行比较,即使NULL =NULL的结果始终是FALSE),这种行为已记录在MySQL参考中。7 `1 R. ?, N8 y/ k6 {' |. A$ b

  ?6 z. u9 E9 y3 HUNIQUE索引会创建一个约束,以使索引中的所有值都必须是唯一的。如果您尝试添加键值与现有行匹配的新行,则会发生错误。对于所有引擎,UNIQUE索引允许可以包含NULL的列使用多个NULL值。
5 N. q9 V/ U3 ]& @: I8 _7 ?
: _; l- G  D3 [; P因此,我认为唯一的方法是定义列NOT NULL或在触发器中处理此问题。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则