前几天,业务组的小伙伴找到我,说在一张核心业务表上使用了MySQL的唯一索引,谁知索引没生效,依然产生了重复数据,导致出现了线上bug,被老大怼了一顿,小伙子一脸疑惑:本地测试好好的,怎么一到上线就出问题了呢?
MySQL的唯一索引很好用,但是有些坑还是要提前了解的,要不掉进去,摔得可老疼了。下面让我们复现一下小伙伴的问题,分析一下为什么会这样?
首先,创建一张product_unique表:
为了保证数据的唯一性,我们创建一个唯一索引:
根据分类编号category_id、单位编号unit_id和商品组属性model_hash的hash值,确定一条唯一的数据。
然后我们插入一条数据,结果显示成功。
我们把这条sql重复执行一次:
咦,唯一索引的约束生效了,并没有什么问题啊?
别急,我们把sql中的model_hash改成null,并且执行两次插入sql:
咦,插入成功了,我的唯一索引约束呢?
我们再执行几次这条sql,发现还是可以成功执行,奇怪不奇怪?
问题出现在哪里呢,其实很明显:唯一索引的字段中,出现了Null值。MySQL在官方文档中,有明确的说明:创建唯一索引的字段,都不能允许为null,否则mysql的唯一性约束可能会失效。
我们在日常开发过程中,要特别注意设置字段的默认值,如果字段默认值为null,可能会导致很多意料之外的bug,比如条件查询,count统计,建议大家在创建表时,结合业务场景,提前给字段设置好合适的默认值。
我是程序员拾山,欢迎