mybatis-plus逻辑删除与唯一约束冲突问题
作者:今天你写代码了吗??
问题描述:
在使用mybatis-plus进行数据库的增删查改的时候,我们一般都会设置用户名为唯一索引(为什么?因为用户名肯定不能重复)
当第一次新增用户时,会在数据库插入一条用户数据:能插入成功代表用户名不重复:
关心这两个字段:
- username:zhangsan
- is_deleted:0 (未删除状态)
此时的数据库用的username唯一索引:
那么当这个用户被删除的时候:
is_deleted: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字段设置当前时间戳,然后再删除数据
第三次添加和删除用户相同用户名的数据时,可以正常添加
第二次删除数据的时候因为时间戳设置的不同,可以正常删除
到此这篇关于mybatis-plus逻辑删除与唯一约束冲突问题的文章就介绍到这了,更多相关mybatis-plus逻辑删除与唯一约束冲突内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!