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

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

时间:2023-10-11 22:33:09浏览次数:40  
标签:方案 删除 数据库 业务 约束 del unique

前言

不知道大家有没有遇到这么一种业务场景,在业务中有个唯一约束A,当该业务进行逻辑删除后(设置标记为删除状态is_del = 1),再往唯一约束列插入相同的值时,此时会报Duplicate entry,但在业务上,该值时必须要插入的。今天我们就来聊聊处理这种业务场景的几种思路

解决思路

方案一:不采用逻辑删除,直接物理删除

方案二:新建历史表

主表进行物理删除,同时将删除的记录保存到历史表中

方案三:变更删除标记为时间戳

将删除状态不以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

方案的取舍

方案一得从业务的角度上考虑了,如果物理删除,对业务无损,那就无所谓了。方案二等于需要删除的记录的表都需要有历史表,如果仅仅是用来实现记录删除记录,感觉有点大材小用。方案三和方案四其实实现的思路是一样,不过如果已经是在线上跑的业务,还是推荐用第四种方案,毕竟新增字段正常对已有的业务影响相对较小,如果是第三种方案,直接将标志位修改为时间戳,可能还会涉及改业务。如果是新增业务,第三种和第四种方案比较推荐。

 

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://www.cnblogs.com/lingyejun/p/17758400.html

标签:方案,删除,数据库,业务,约束,del,unique
From: https://www.cnblogs.com/lingyejun/p/17758400.html

相关文章

  • 导出微信支付交易明细证明账单记录修改删除PDF文件
    微信支付交易明细证明有两种修改方式,一种是导出账单到邮箱后再下载PDF账单文件到电脑桌面进行修改。第二种是导出前在后台修改,这种情况较为复杂要根据个人情况而定,暂不做陈述。现在先来说说第一种方式,先下载账单文件然后把PDF转成WORD的方式进行修改,这种方式简单粗暴,相信很多人都......
  • Firefly Image 2 Model 新增​功能
    FireflyImage2Model(Beta)现​已​可用通过​更高​质量​的​图像​和​插图​生成,​以及​自​定义​选项​和​改进​的​动态​范围,​更​快​地​实现​您​的​创意​愿景。立即​尝试FireflyImage2(Beta)轻松​尝试​不同​的​样式通过​将​现有​图......
  • django model 条件过滤 queryset.filter详细用法
    条件选取querySet的时候,filter表示=,exclude表示!=。querySet.distinct()去重复__exact精确等于like'aaa'__iexact精确等于忽略大小写ilike'aaa'__contains包含like'%aaa%'__icontains包含忽略大小写ilike'%aaa%',但是对于sqlite来说,contains的作用效果等同......
  • 04删除倒数第n个节点
    我的想法:找到倒数第n-1个节点,通过遍历问题:*需要准确计算需要循环多少次才能找到第n-1个节点。*假如有5个节点,要删除倒数第2个节点,有个虚拟头结点的情况下,用count=0计数需要遍历第一次,到第一个节点,count=1,遍历第二次,到第二个节点,count=2,当count==n-1时,不再遍历,此时curr指针指......
  • hive数据库指定删除首行数据
    在我们将csv文件或者txt文件导入到虚拟机本地时,要是不提前将首行的数据指引删除,就会跟随着我们的期望数据显示在hive的数据库里面,上次测试,我就是直接在csv文件里面删除了,但是运行起来确实稍微慢了一点,要是数据条数再多一些,就很难直接在根文件里面进行删除,所以,我找到了一个新的方......
  • 软件测试|Linux 基础教程:创建和删除目录
    简介在Linux系统中,创建和删除目录是非常常见的操作。目录是用于组织文件和其他目录的一种结构,它们是组织文件系统的重要组成部分。本文将介绍如何在Linux系统中创建和删除目录。创建目录在Linux中,可以使用mkdir命令来创建一个新的目录。mkdir是MakeDirectory(创建目......
  • C++黑马程序员——P223-226. set容器 构造和赋值,大小和交换,插入和删除,查找和统计
    P223.set容器——构造和赋值P224.set容器——大小和交换P225.set容器——插入和删除P226.set容器——查找和统计P223.set容器构造和赋值特点:所有元素都会在插入时自动被排序本质:set/multiset属于关联式容器,底层结构是用二叉树实现。set和multiset的区别set不......
  • 操作索引库-创建索引库(索引库相当于数据库,文档相当于数据库中的表,一种即具有相同数据
    创建索引库时可先定义映射,类似数据库中的约束 {"mappings":{"properties":{"title":{"type":"text"},"name":{"type":"text"},"created_at......
  • ADO.NET读取MySQL数据库的三种方式:DataReader、DataSet、DataView
    https://blog.csdn.net/lilongsy/article/details/127351421ADO.NET读取MySQL数据库有多种方式:DataReader、DataSet、DataView。Command对象的ExecuteScalar方法查询数据库获取某个单个值,但是如果获取多行、多列可以用ExcecuteReader,ExcecuteReader返回一个DataReader的数据流对......
  • geonetwork更改默认数据库配置
    默认情况下,H2数据库是在GeoNetwork应用程序首次启动时配置和创建的。本文介绍如何将默认数据库更改为PostgreSQL数据库。本文使用环境:操作系统:Windows11JDK版本:jdk-8u381-windows-x64.exeElasticsearch版本:elasticsearch-7.9.2-windows-x86_64.zipGeoNetwork版本:geonetwork......