mybatis-plus逻辑删除与唯一约束冲突问题

4 篇文章 0 订阅
3 篇文章 0 订阅

问题描述:

在使用mybatis-plus进行数据库的增删查改的时候,我们一般都会设置用户名为唯一索引(为什么?因为用户名肯定不能重复)

  1. 当第一次新增用户时,会在数据库插入一条用户数据:能插入成功代表用户名不重复:
    关心这两个字段:

username:zhangsan
is_deleted:0 (未删除状态)

在这里插入图片描述

  1. 此时的数据库用的username唯一索引:

在这里插入图片描述

那么当这个用户被删除的时候:

is_deleted:1 (删除状态)

  1. 此时当再次添加用户名为zhangsan的用户的时候就会触发唯一索引添加数据失败的情况(为什么呢,因为删除的用户数据在数据库里面使用的是改变is_deletd字段的值来表示的逻辑删除,用户数据其实还是存在数据库的,当添加用户的时候用户名和已删除的用户的用户名重复还是会触发唯一索引冲突)

Duplicate entry ‘重复的用户名’ for key ‘sys_user.idx_username’

解决方案

方案一 :直接删除

在删除用户数据的时候不使用逻辑删除,而是直接删除用户数据

结果:直接删除数据,不符合假删除逻辑,不推荐

方案二:设置联合唯一索引

字段的唯一约束,改为字段.与删除标记字段的联合唯一约束
通过设置username和is_deleted联合唯一索引

在这里插入图片描述
在这里插入图片描述

这样当删除数据的时候,将数据的is_deleted字段为1,再次添加相同用户名的数据时,会判断是否存在username重复并且is_deleted = 0(添加数据的时候默认为0) 的数据(因为此时删除的数据is_deleted = 1) 所以可以正常添加数据。

那么再次添加用户名重复的数据(未删除)的时候会再次触发唯一索引

Duplicate entry '重复用户名-0' for key ‘sys_user.idx_username’

注意:(可以忽略上面的使用username和is_deleted字段做唯一索引的做法)

上面这样还会出现一个问题,当再次删除数据的时候(此时数据库表中已经有删除的遗留数据),username和is_deleted联合唯一索引还是会重复,如图表示:
在这里插入图片描述

问题解决方案:

参考链接:逻辑删除和唯一约束冲突的解决方案

此时可以追加一个删除记录字段,默认为1
在这里插入图片描述
此时联合唯一索引为:
在这里插入图片描述
在这里插入图片描述

第一次添加数据的时候,deleteAt默认为1
第二次添加相同用户名数据会触发唯一索引(username相同 并且deleteAt=1)

第一次删除数据的时候,给deleteAt字段设置当前时间戳,然后再删除数据
在这里插入图片描述
第三次添加和删除用户相同用户名的数据时,可以正常添加
第二次删除数据的时候因为时间戳设置的不同,可以正常删除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值