往一个UNIQUE列里连续插入3个NULL,全部成功;再插入两个相同的非NULL值,第二次立刻报错——验证唯一索引对NULL和非NULL值是两套判断标准。
唯一索引的作用是"不允许重复值",NULL算不算重复。
代码CREATE TABLE t10 (id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(100), UNIQUE KEY uq_email(email)); INSERT INTO t10 (email) VALUES (NULL); INSERT INTO t10 (email) VALUES (NULL); INSERT INTO t10 (email) VALUES (NULL);
按理说是同一个唯一索引,3次一样的值,却没有一次报错。
结果SELECT * FROM t10; → 1 NULL → 2 NULL → 3 NULL (3行全部插入成功,没有任何唯一索引冲突)
验证了MySQL对UNIQUE约束的一条特殊规则:NULL不参与唯一性比较。SQL标准里,任何值跟NULL做比较(包括NULL跟NULL比)结果都是"未知",不是"真",所以数据库认为"两个NULL"不构成重复——多少个NULL都能塞进同一个唯一索引列。
同一个索引,换成相同的具体值。
结果INSERT INTO t10 (email) VALUES ('a@x.com'); INSERT INTO t10 (email) VALUES ('a@x.com'); 报错: Duplicate entry 'a@x.com' for key 't10.uq_email'
每一步都是本文上面用MySQL跑出来的原始结果。