加了唯一索引,怎么还是产生重复数据?

文章探讨了在数据库中加了唯一索引后仍出现重复数据的问题。作者通过实例分析了唯一索引字段包含null时唯一性约束失效的情况,并提出了逻辑删除表加唯一索引的解决方案,包括删除状态加1、增加时间戳字段和增加id字段。此外,还讨论了如何处理已有重复历史数据和给大字段加唯一索引的策略。
摘要由CSDN通过智能技术生成

前言

前段时间我踩过一个坑:在mysql8的一张innodb引擎的表中,加了唯一索引,但最后发现数据竟然还是重复了。

到底怎么回事呢?

本文通过一次踩坑经历,聊聊唯一索引,一些有意思的知识点。

cb0c8ede572fb1dc8aaba63a42ad683f.png

1.还原问题现场

前段时间,为了防止商品组产生重复的数据,我专门加了一张防重表。

问题就出在商品组的防重表上。

具体表结构如下:

CREATE  TABLE  `product_group_unique` (
   `id`  bigint  NOT  NULL,
   `category_id`  bigint  NOT  NULL,
   `unit_id`  bigint  NOT  NULL,
   `model_hash`  varchar( 255)  COLLATE utf8mb4_bin  DEFAULT  NULL,
   `in_date` datetime  NOT  NULL,
  PRIMARY  KEY ( `id`)
)  ENGINE= InnoDB  DEFAULT  CHARSET=utf8mb4  COLLATE=utf8mb4_bin;

为了保证数据的唯一性,我给那种商品组防重表,建了唯一索引:

alter  table product_group_unique  add  unique  index 
ux_category_unit_model(category_id,unit_id,model_hash);

根据分类编号、单位编号和商品组属性的hash值,可以唯一确定一个商品组。

给商品组防重表创建了唯一索引之后,第二天查看数据,发现该表中竟然产生了重复的数据:436a75ae98c55998786a63bb9a184e77.jpeg表中第二条数据和第三条数据重复了。

这是为什么呢?

2.唯一索引字段包含null

如果你仔细查看表中的数据,会发现其中一个比较特殊地方:商品组属性的hash值(model_hash字段)可能为null,即商品组允许不配置任何属性。

在product_group_unique表中插入了一条model_hash字段等于100的重复数据:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值