一、起因

因为在"阿里巴巴java开发手册"中建议将数据库中有唯一性的字段,最好都加上唯一索引,还在这里知道了“墨菲定律”,因为存在代码出错的问题,那么总有一天会发生这个唯一的字段插入了两个一样的内容,会引发错误,所以必须要加“唯一索引”,但在操作后,发现唯一索引和逻辑删除冲突了。
在这里插入图片描述

二、经过

1.插入冲突

因为逻辑删除表示该内容删除后仍然存在于数据库中,一开始我的删除标志为“mybatis-plus”默认的,即0代表未删除,1代表删除,但问题出现在了两个相同信息删除之后,因为此时数据库中存在两个一样的数据,触发了唯一索引的冲突。
举例说明:比如name字段为唯一索引的字段,我先插入一个name为‘张三’的数据进入,然后删除该数据,这样理论上可以继续插入‘张三’,但因为name为唯一索引,原有删除的‘张三’仍然在数据,于是便会冲突。

2.删除冲突

在第一步之后,我觉得使用索引组,name和删除标识放入一组,形成唯一索引组,但这个看似解决了插入的问题,但在上一个步骤后,继续删除第二个插入的‘张三’,又会产生冲突。

3.绝望

到此,我已经觉得没办法了,所以只能放弃唯一索引了。

三、结果

后来通过查资料,发现可以将删除标识默认的"1"改成“NULL”,即在数据库中存入NULL作为删除标识。具体操作如下:

1.数据库测试会不会冲突

1.1这是简单数据库

在这里插入图片描述

1.2设置唯一索引组(name+“删除标识”)

在这里插入图片描述

1.3测试插入冲不冲突

1.这样肯定会冲突,这就是我要利用的,避免插入相同的name
在这里插入图片描述
2.先将一个删除,另一个插入是不冲突的(没问题)
在这里插入图片描述
3.再将第二个删除,也不冲突(这是上面最后一个问题,这里已经得到解决,两个为空的删除标识不会相互冲突)
在这里插入图片描述

2.SpringBoot+Mybatis-plus方案

2.1从网上找到的资料都是建议在配置文件中这样配置

在这里插入图片描述

2.2但是在多人开发的微服务中,为了减少繁琐,一般都会用代码方式配置

一直没找到代码如何配置,今天突然间恍然大悟,我在想我设计会怎么去配置,果然找到了
注解
在全局的基类中逻辑删除字段设置有逻辑删除的注解,果然,这个注解中有两个值,他们便是删除标识的配置。踩坑很久了,所以在此记录,这也是不求甚解的原因,如果一开始就去了解**@TableLogic**这个注解,便很快就可以解决这个问题了!
注:
1.上述截图有来自《阿里巴巴java开发手册-嵩山版》
2.本文中引用了很多前辈的内容,无法一一陈列,如有问题,还请见谅,告知本人后会及时更正
3.上述表述如有问题,还请斧正

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐