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统计,建议大家在创建表时,结合业务场景,提前给字段设置好合适的默认值。

好了,分享就到这里,感谢大家的阅读。

展开阅读全文

页面更新:2024-04-18

标签:索引   数据   可能会   意料之外   字段   小伙子   疑惑   奇怪   编号   业务

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top