美文网首页程序员
如何解决逻辑删除与数据库唯一约束冲突

如何解决逻辑删除与数据库唯一约束冲突

作者: linyb极客之路 | 来源:发表于2020-11-21 00:14 被阅读0次

前言

不知道大家有没有遇到这么一种业务场景,在业务中有个唯一约束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和数据库的一致性。方案四和方案五其实实现的思路是一样,不过如果已经是在线上跑的业务,还是推荐用第五种方案,毕竟新增字段正常对已有的业务影响相对较小,如果是第四种方案,直接将标志位修改为时间戳,可能还会涉及改业务。如果是新增业务,第四种和第五种方案比较推荐

相关文章

  • 如何解决逻辑删除与数据库唯一约束冲突

    前言 不知道大家有没有遇到这么一种业务场景,在业务中有个唯一约束A,当该业务进行逻辑删除后(设置标记为删除状态),...

  • SQL 中的约束语句

    数据库:SQL Server 通用语法 1. 唯一性约束 UNIQUE 创建 删除 2. 主键约束 创建 删除 3...

  • 数据表修改

    添加单列 添加多列 删除列 添加主键约束 添加唯一约束 添加外键约束 添加/删除默认约束 删除主键约束 删除唯一约...

  • DM7表中有重复数据处理办法

    问题描述:如何删除数据库中的重复数据问题原因:某些时候,数据库中需要添加新的唯一性约束,但是数据库中已经存在了重复...

  • 答辩可能遇到的简单提问

    怎么连接数据库? 通过JDBC连接mysql数据库 数据库删除是逻辑删除还是物理删除? 逻辑删除.修改的只是数据的...

  • 详解intrinsicContentSize 与 AutoLay

    在使用AutoLayout时,经常会产生约束冲突,我们可以通过改变约束优先级,及模糊约束来解决冲突。 Conten...

  • Python 高级 14(3)数据库约束

    数据库常用约束、增加删除约束、数据库导入导出、数据表设计思想-三大范式 2.4.8 添加约束 约束是一种限制,它通...

  • 逻辑删除如何保证数据库记录唯一

    需要考虑: 文件被删除后有可能会再创建一个同名的文件; 新创建的文件也可能再次被逻辑删除; 第二个文件被删除后还可...

  • iOS 约束冲突解决

    AutoLayout使用起来方便快捷,但是当我们的约束设置出现冲突的时候就是非常蛋疼的时候了,下面说说我解决约束冲...

  • Mysql 使用教程

    1.MySQL基础知识 E-R模型 三范式 字段类型 约束 逻辑删除-这点很重要,适用于重要数据 2.数据库基本操...

网友评论

    本文标题:如何解决逻辑删除与数据库唯一约束冲突

    本文链接:https://www.haomeiwen.com/subject/rchsiktx.html