逻辑删除
-
-
传统:
- 在数据库上加一个字段:deleted/delete_time/delete_at 或者还可以使用状态表(新建一个表来专门存状态) 还有视图(将未删除的数据专门拿出来查询)/触发器(在执行删除操作时自动改为执行逻辑删除)等实现方式
- 在实体类上添加字段
- 修改sql
- 对于条件的判断全都加上该字段
- 在查询时添加
- 删除改为更新该字段的值
-
mp:
- 在数据库上加一个字段:deleted/delete_time/delete_at
- 在实体类上添加字段 在该字段上加上@TableLogic
- 在application上配置:mybatis-plus.gloabl-config.db-config.logic-delete=1 mybatis-plus.gloabl-config.db-config.logic-delete=1
-
其中对于这几个字段
- deleted 是布尔值 , 用0和1来区别
- 但是如果表存在唯一索引,就会报错
- 比如手机号,如果上一次,该手机号被删除了,这次再添加该手机号的用户,由于是逻辑删除,那么手机号重复了,就出错了
- 所以这个字段适合于没有唯一索引的表
- delete-time 是被删除时的具体的时间,如果没有被删除就是null
- 这样的的话,将这个字段与那个唯一字段建立起唯一索引,只有这两个字段同时重复出现两次,才会出错,而删除的时间是几乎不会重复的。
- 比如:还是手机号,当我们删除了第一次的记录,此时delete-time是时间数据,当我们再次插入时,由于delete-time不同,所以不会触发唯一索引的限制。这样就解决了唯一索引的问题。
- 但是由于没有删除的数据的delete-time是null,两个null并不会被判定为相同,不会触发唯一索引。
- 这也就导致了,手机号还没有被删除时,由于delete-time不同,再插入相同的手机号也不会被唯一索引识别。也就出现了手机号相同的两条数据且是同时生效的
- delete-at 是被删除时的时间戳,若没有被删除就是0
- 由于没有被删除时是0,不是null,两个0是可以被数据库的唯一性约束识别的,那么就解决了问题
- 比如:手机号相同时,该手机号还没有被删除,第一条数据的delete-at是0,想要再插入一条数据,此时手机号相同,delete-at也相同,就无法插入,就解决了问题
- 但是这个看不到删除的时间了。(这个需求其实可有可无)
- delete-at与delete-time同时使用。
- 这样即可以保证唯一索引,也可以实现看到时间。
- deleted 是布尔值 , 用0和1来区别
-