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

问题描述:

在使用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联合唯一索引

在这里插入图片描述
mybatis-plus逻辑删除与唯一约束冲突问题_第1张图片

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

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

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

你可能感兴趣的:(#,mybatis,报错记录,Java,mybatis,oracle,数据库)