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

news2025/1/11 23:55:32

问题描述:

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

在这里插入图片描述
在这里插入图片描述

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

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

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

注意:(可以忽略上面的使用username和is_deleted字段做唯一索引的做法)

上面这样还会出现一个问题,当再次删除数据的时候(此时数据库表中已经有删除的遗留数据),username和is_deleted联合唯一索引还是会重复,如图表示:
在这里插入图片描述

问题解决方案:

参考链接:逻辑删除和唯一约束冲突的解决方案

此时可以追加一个删除记录字段,默认为1
在这里插入图片描述
此时联合唯一索引为:
在这里插入图片描述
在这里插入图片描述

第一次添加数据的时候,deleteAt默认为1
第二次添加相同用户名数据会触发唯一索引(username相同 并且deleteAt=1)

第一次删除数据的时候,给deleteAt字段设置当前时间戳,然后再删除数据
在这里插入图片描述
第三次添加和删除用户相同用户名的数据时,可以正常添加
第二次删除数据的时候因为时间戳设置的不同,可以正常删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/770288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机科学与技术专业课程内容汇总

大学课程结束了,真的好快。昨天把专业课程涉及到的内容汇总了下,还是挺多的,存到网盘里也不会丢,电脑存储空间还能扩大。 把网盘链接放在这里,希望大家共勉。图片中所涉内容仅为部分课程。 链接:https://…

Jmeter测试 Websocket服务器

目录 一、Jmeter 安装1.1 自定义 JMeter 的 JVM 设置 二、WebSocket插件安装三、环境准备3.1 连接数限制修改 四、测试4.1 脚本构建4.1.1 连接请求4.1.2 心跳4.1.3 WebSocket request-response Sampler4.1.4 WebSocket Single Write Sampler4.1.5 WebSocket Single Read Sample…

Mac配置CMake

目录 写在前面命令行安装安装包安装准备配置 参考完 写在前面 1、本文内容 Mac上配置CMake 2、平台 Mac 3、转载请注明出处: https://blog.csdn.net/qq_41102371/article/details/131807995 命令行安装 通过brew安装,先安装brew https://blog.csdn.n…

Sourcetree 同时推送两个仓库

Sourcetree 同时推送两个仓库 添加远端仓库添加完成推送推送完成git 命令版 添加远端仓库 注意名称不能相同 ,自己取个名子区分一下,别把自己搞懵就行了。 添加完成 推送 选择仓库。选择目标分支。并勾选跟踪。推送。 推送完成 推送完成后,…

应用案例|探索高精度3D机器视觉在车间滑橇检测与测量中的应用

Part.1 应用行业 随着科技的不断进步,3D机器视觉技术逐渐成为了现实世界与数字世界之间的桥梁。3D机器视觉技术能使计算机感知和理解三维空间重的物体和场景,被广泛应用于机器人引导、工业检测等行业,例如:物流、电商、教育、医疗…

开发 SpringBoot 项目所用版本的选择

一、为什么要关注 springboot 的版本? 最开始做项目时候,组长说创建一个 springboot 2.5.4 的项目,mysql使用 5.6.X ,maven使用是3.6.X。其实最开始我也没有多想,直接照做了,但是后面回想自己平时看到的SpringBoot开源…

【Win10系统下载Python3】

Python3官网:https://www.python.org/downloads/windows/ 注

谷歌Bard:ChatGPT之外的第三选择

2023年年初,为了对应ChatGPT方面的压力,谷歌Bard仓促上线,此后便进入了低调前行。目前为止已经迭代了9个版本,也就是在近期的版本更新中支持了中文(简体/繁体)语言,对国内用户可以说又友好了一步…

pytest入门介绍

目录 1、pytest是一个非常成熟的全功能的Python测试框架。 2、pytest安装 3、要求 4、运行 5、生成html报告 6、常见问题 1、pytest是一个非常成熟的全功能的Python测试框架。 主要有以下几个特点: 简单灵活,容易上手 支持参数化 能够支持简单的…

孩子没有身份证如何坐火车

既然写这个话题就有必要搞清楚,儿童多大是免票的。(儿童票怎么买,我们在买票的时候点击选择乘车人,左侧是添加乘车人右侧是添加随行儿童) 如果你有12306app 点击app -> 点击我的 -> 点击使用须知 -> 点击常见问题 上面的有效证件…

配置需求分类中的科目分配

其中科目分配的内容都为灰色无法修改 结果是在科目分配里面单独维护的: 路径:销售分销-基本功能-科目分配/成本-维护成本科目分配的需求类别

three.js学习(基础)

目录 前言: 参考文档: 实现 1、安装 2、声明 3、引入使用 前言: 前面学习了three.js物体的动画展示,接下来学习应用图形界面更改变量 目标、页面提供操作区域进行变量修改 参考文档: dat.gui - npmA lightwe…

韦东山Linux驱动入门实验班(4)LED驱动

前言 (1)我们学习完hello驱动之后,对驱动程序开发有了一点点认识了之后。现在可以开始对硬件进行实际操作了,本人使用的是i.max6ull开发板,STM32MP157和全志的D1H也会进行讲解。 (2)如果还有对于…

ubuntu 设置系统时间矫正

1、安装ntpdate,同步标准时间 2、修改时区 3、在.profile文件中写入上面提示的信息,保存退出、更新配置文件或者重启生效 3.1、或者配合上面的cp那条命令,用下面的命令保存到底层 $ hwclock --systohc 4、重启之后,查看日期时间已…

【动手学深度学习】--14.网络中的网络 NiN

文章目录 网络中的网络 NiN1.NiN块1.2NiN架构1.3NiN模型1.4训练模型 网络中的网络 NiN 学习视频:网络中的网络 NiN【动手学深度学习v2】 官方笔记:网络中的网络(NiN) 全连接层的问题 LeNet、AlexNet和VGG都有一个共同的设计模式…

如果微信消息显示“已读”的话......

近日,一则 #如果微信显示已读的话# 话题冲上了微博热搜榜单。 “已读”是很多社交软件拥有的功能,如果对方接收并查看了消息,就会在消息上显示“已读”,但目前微信还没有推出这项功能。 对于“已读”功能,不少网友纷纷…

推荐一款在win、mac、android之间传递文件或消息的软件,LocalSend,前提需要在同一网络下

官方地址 https://github.com/localsend/localsend/releases/download/v1.10.0/LocalSend-1.10.0.dmg 可选择不同的设备进行发送接收,超级好用

我又被文章版权碰瓷公司起诉了:索赔10000元

我是卢松松,点点上面的头像,欢迎关注我哦! 事情是这样的,昨天我正在上班摸鱼,突然收到一个从新疆乌鲁木齐打来的电话。我本不想接,以为又是广告骚扰电话,结果突然弹出一条短信,说是…

Ceph 分布式存储之应用

一、创建 CephFS 文件系统 MDS 接口 1、服务端操作 1)在管理节点创建 mds 服务 [rootadmin ceph]# cd /etc/ceph [rootadmin ceph]# ceph-deploy mds create node01 node02 node03 [ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.c…

Vue3栅格(Grid)

24 栅格系统 概述 布局的栅格化系统,我们是基于行(Row)和列(Col)两个组件相互配合来定义信息区块的外部框架,以保证页面的每个区域能够稳健地排布起来。 下面简单介绍一下它的工作原理: 通过Ro…