Mysql:明明加了唯一索引,怎么还是出现重复数据了呢?
前几天,业务组的小伙伴找到我,说在一张核心业务表上使用了MySQL的唯一索引,谁知索引没生效,依然产生了重复数据,导致出现了线上bug,被老大怼了一顿,小伙子一脸疑惑:本地测试好好的,怎么一到上线就出问题了呢?

MySQL的唯一索引很好用,但是有些坑还是要提前了解的,要不掉进去,摔得可老疼了。下面让我们复现一下小伙伴的问题,分析一下为什么会这样?
首先,创建一张product_unique表:
CREATE TABLE `product_unique` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`category_id` BIGINT NOT NULL,
`unit_id` BIGINT NOT NULL,
`model_hash` VARCHAR ( 255 ) COLLATE utf8mb4_bin DEFAULT NULL,
`in_date` datetime NOT NULL,
deleted TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin;
为了保证数据的唯一性,我们创建一个唯一索引:
ALTER TABLE product_unique ADD UNIQUE INDEX
unique_category_unit_model ( category_id, unit_id, model_hash );
根据分类编号category_id、单位编号unit_id和商品组属性model_hash的hash值,确定一条唯一的数据。
然后我们插入一条数据,结果显示成功。

我们把这条sql重复执行一次:

咦,唯一索引的约束生效了,并没有什么问题啊?
别急,我们把sql中的model_hash改成null,并且执行两次插入sql:

咦,插入成功了,我的唯一索引约束呢?
我们再执行几次这条sql,发现还是可以成功执行,奇怪不奇怪?
问题出现在哪里呢,其实很明显:唯一索引的字段中,出现了Null值。MySQL在官方文档中,有明确的说明:创建唯一索引的字段,都不能允许为null,否则mysql的唯一性约束可能会失效。
我们在日常开发过程中,要特别注意设置字段的默认值,如果字段默认值为null,可能会导致很多意料之外的bug,比如条件查询,count统计,建议大家在创建表时,结合业务场景,提前给字段设置好合适的默认值。
相关推荐
-
MYSQL常用函数,IF函数,IFNULL,CASE运算符2025-04-16 00:43:20
-
MySQL7:视图2025-04-16 00:42:48
-
PHP 操作 rabbitMQ 两种方式2025-04-16 00:30:06
-
php json_encode 中文不转码2025-04-16 00:28:34
-
Mysql:明明加了唯一索引,怎么还是出现重复数据了呢?2025-04-16 00:01:40