‘逻辑删除‘和‘唯一索引‘冲突的解决方案
'逻辑删除'和'唯一索引'冲突的解决方案一、起因二、经过1.插入冲突2.删除冲突3.绝望三、结果1.数据库测试会不会冲突1.1这是简单数据库1.2设置唯一索引组(name+"删除标识")1.3测试插入冲不冲突2.SpringBoot+Mybatis-plus方案2.1从网上找到的资料都是建议在配置文件中这样配置2.2但是在多人开发的微服务中,为了减少繁琐,一般都会用代码方式配置一、起因因为在"阿里
'逻辑删除'和'唯一索引'冲突的解决方案
一、起因
因为在"阿里巴巴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.上述表述如有问题,还请斧正
更多推荐
所有评论(0)