如何解决逻辑删除与数据库唯一约束冲突
前言
不知道大家有没有遇到这么一种业务场景,在业务中有个唯一约束A,当该业务进行逻辑删除后(设置标记为删除状态),再往唯一约束列插入相同的值时,此时会报Duplicate entry,但在业务上,该值时必须要插入的。今天我们就来聊聊处理这种业务场景的几种思路
解决思路
方案一:不采用逻辑删除,直接物理删除
方案二:新建历史表
主表进行物理删除,同时将删除的记录保存到历史表中
方案三:取消表的唯一约束,同时引入redis来保证唯一约束
取消表的唯一约束,在项目中引入redis,通过redis来判重,新增时往redis set记录,删除时,删除redis记录
方案四:变更删除标记为时间戳
将删除状态不以0,1表示,而是以时间戳为值,然后将删除状态为与之前的唯一约束A重新组成唯一联合约束index(A、del_flag),删除时变更del_flag的时间戳
方案五:保留删除标记,同时新建一个字段del_unique_key
保留删除状态位,再新增一个字段del_unique_key,该字段默认值为0,字段类型和大小与主键id保持一致,同时与原先的唯一约束重新组成联合唯一约束index(A,del_unique_key),业务进行逻辑删除,变更del_unique_key的值为该删除行的主键id
方案的取舍
方案一得从业务的角度上考虑了,如果物理删除,对业务无损,那就无所谓了。方案二等于需要删除的记录的表都需要有历史表,如果仅仅是用来实现记录删除记录,感觉有点大材小用。方案三引入redis,虽然也可以解决问题,但是又额外增加复杂度,同时还得保证redis和数据库的一致性。方案四和方案五其实实现的思路是一样,不过如果已经是在线上跑的业务,还是推荐用第五种方案,毕竟新增字段正常对已有的业务影响相对较小,如果是第四种方案,直接将标志位修改为时间戳,可能还会涉及改业务。如果是新增业务,第四种和第五种方案比较推荐

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
轻松应对海量数据,TiDB 在车好多的实践
车好多集团系国内领军的汽车消费服务一站式平台,旗下拥有瓜子二手车、毛豆新车、车好多车后三大核心业务。 业务挑战 车好多集团关注 TiDB 始于 2018 年初,像大多数公司一样,公司发展初期为了快速适配业务开发,大部分数据都存储在 MySQL 中。但随着业务快速发展,存量数据越来越多,我们在 MySQL 面临着如下痛点: 业务拆分复杂 公司业务发展快,单实例的 QPS 和数据存储会超出预期,这时候需要对业务线实例进行拆分。 每次业务线拆分需要从数据产生端 (APP) 到数据流转端 (CDC) 最后到数据仓库(DW)一起配合调整; 如果涉及到多方同时使用相同库表,还需要多个应用的负责人协调; 同时一些脚本类程序可能在迁移时被忽略,部分业务数据会受到影响。 每次业务线拆分的周期大概在 2-4 周,耗费人力。 分库分表侵入业务 业务发展到一定程度之后,一些数据表的数据量超过千万级别,常规做法是分库分表。这里有几个可能遇到的问题: 分布式事务不好处理; 二级索引无法创建; 分库分表的设计是否支持二次扩容; 跨库 join 无法操作; 结果集的排序合并难度大。 大表结构修改困难 我们公司的业务模...
- 下一篇
Mysql索引、视图、存储过程和函数、触发器、存储引擎(一)
Mysql高级,数据库优化 一、知识点 1、索引 创建索引 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name(index_col_name,...) 查看索引 show index 1 from table_name; 删除索引 DROP INDEX index_1 name ON tbl_name; 设计原则: 对查询频次较高,且数据量比较大的表建立索引。 索引字段的选择,最佳候选列应当从where子句的条件中提取 使用唯一索引,区分度越高,使用索引的效率越高。 索引可以有效的提升查询数据的效率,但索引数量不是多多益善,索引越多会引入相当高的维护代价,降低DML操作的效率,增加相应操作的时间消耗。 使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O效率,也可以提升总体的访问效率。 利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装