相关文章推荐
温暖的海龟  ·  达梦spring-data-jdbc - ...·  1 周前    · 
憨厚的芒果  ·  mybatis ...·  1 周前    · 
发呆的作业本  ·  user:sendMail - ...·  1 年前    · 
首页 > 软件编程 > java > MyBatisPlus逻辑删除与唯一索引冲突

详解MyBatisPlus逻辑删除与唯一索引冲突问题

作者:此去经年天问

这篇文章主要介绍了详解MyBatisPlus逻辑删除与唯一索引冲突问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、问题背景:

在开发中,我们经常会有逻辑删除和唯一索引同时使用的情况。但当使用mybatis plus时,如果同时使用逻辑删除和唯一索引,会报数据重复Duplicate entry的问题。

举个例子:

原来数据库结构:

这里location_id是唯一索引

CREATE TABLE `eam_location` ( `id` int(11) NOT NULL AUTO_INCREMENT, `location_id` varchar(50) UNIQUE NOT NULL COMMENT '位置代码', `location_level` tinyint(1) NOT NULL COMMENT '位置级别', `location_name` varchar(50) NOT NULL COMMENT '位置名称', `parent_location_id` varchar(50) COMMENT '上级位置代码', `delete_flag` tinyint(1) DEFAULT 0 COMMENT '软删除', `version` int(11) DEFAULT 1 COMMENT '乐观锁', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这里在删除添加某一条数据后,delete_flag变成0,当删除后delete_flag会变成1,再次添加相同的数据时,由于数据库检测不到原来数据,会报数据重复Duplicate entry的问题

解决办法: 参考逻辑删除与唯一约束的需求冲突

SQL数据结构,将delete_flag用时间戳进行表示,唯一索引变成了联合唯一索引 UNIQUE KEY unique_location_delete_flag(location_id, delete_flag) ,当添加一条数据时,delete_flag变成null,当删除数据时,delete_flag变成删除时的一个时间戳。再次添加相同数据时,由于添加的数据是联合唯一索引unique_location_delete_flag ,delete_flag为null,不会产生冲突,多次删除也是,完美解决问题。

CREATE TABLE `eam_location` ( `id` int(11) NOT NULL AUTO_INCREMENT, `location_id` varchar(50) NOT NULL COMMENT '位置代码', `location_level` tinyint(1) NOT NULL COMMENT '位置级别', `location_name` varchar(50) NOT NULL COMMENT '位置名称', `parent_location_id` varchar(50) COMMENT '上级位置代码', `delete_flag` datetime COMMENT '软删除', `version` int(11) DEFAULT 1 COMMENT '乐观锁', PRIMARY KEY (`id`), UNIQUE KEY `unique_location_delete_flag`(`location_id`, `delete_flag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

entity类:

@AllArgsConstructor @NoArgsConstructor @Builder(toBuilder = true) @Data @EqualsAndHashCode(callSuper = false) public class EamEquipmentType implements Serializable { private static final long serialVersionUID = 1L; * 数据库自增id @TableId(value = "id", type = IdType.AUTO) private Integer id; * 设备类型编号 private String typeId; * 设备类型 private String typeName; * 设备厂商 private String manufacture; * 设备型号 private String model; * 标准设备bom 0:未创建 1:已创建 private Boolean typeBom; * 标准设备bom id private Integer typeBomId; * 创建时间 private LocalDateTime createTime; * 软删除 @TableLogic() @TableField(fill = FieldFill.INSERT) private LocalDateTime deleteFlag; * 乐观锁 @Version @TableField(fill = FieldFill.INSERT) private Integer version;

yml配置文件:

mybatis-plus: global-config: db-config: logic-delete-value: "now()" #逻辑删除值是个db获取时间的函数 logic-not-delete-value: "null" #逻辑未删除值为字符串 "null"

到此这篇关于详解MyBatisPlus逻辑删除与唯一索引冲突问题的文章就介绍到这了,更多相关MyBatisPlus逻辑删除与唯一索引冲突内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • spring中前端明明传了值后端却接收不到问题解决办法
    spring中前端明明传了值后端却接收不到问题解决办法
    2024-05-05
  • mybatis-plus实现逻辑删除的示例代码
    mybatis-plus实现逻辑删除的示例代码
    2024-05-05
  • Springboot中RedisTemplate设置String、Hash、List过期时间
    Springboot中RedisTemplate设置String、Hash、List过期时间
    2024-05-05
  • dubbo filter中有关bean注入和配置文件读取方式
    dubbo filter中有关bean注入和配置文件读取方式
    2024-05-05
  • mybatis-plus实现逻辑删除的示例代码
    mybatis-plus实现逻辑删除的示例代码
    2024-05-05
  • SpringBoot与SpringMVC第一讲
    SpringBoot与SpringMVC第一讲
    2024-05-05
  • mybatisPlus配置逻辑字段不生效问题解决
    mybatisPlus配置逻辑字段不生效问题解决
    2024-05-05
  • 深入探究SpringBoot拦截器的自定义设计与实现全攻略
    深入探究SpringBoot拦截器的自定义设计与实现全攻略
    2024-05-05
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2024 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号