一次由mysql唯一约束引发的问题

本文探讨在数据库中使用唯一键进行软删除时遇到的问题,提出维护额外字段和使用复合唯一键的解决方案,以确保数据完整性和可恢复性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

把数据库中某一个字段设置成唯一键unique作为限制,那么使用软删除的方法删除掉一条包括这个唯一键的数据时:

我们的需求一般是(软)删除后可以重新添加,那么问题就来了

问题

数据库不知道我是不是软删除,这个字段其他数据也有,那么数据库就会判断插入(编辑)失败(注意:此处是直接抛出异常,可以用try catch去捕捉异常,需要提醒的是mybatis中insert或update语句返回的虽然是int或者是boolean,但是他的内部仍然没有给处理,所以如果使用mybatis的话同样需要手动处理异常)
一般解决思路: 这个时候一般会想到用 这个字段和is_delete 作为唯一字段,好像没啥问题。走下流程,
添加一条新数据 --> 成功
数据这条数据 --> 成功 (is_delete 变为1)
重新添加这条数据–> 成功 ( 字段 + is_delete 0)
删除这条数据 --> 失败 发现和第二步数据重复(唯一约束不允许我们字段相同) 数据库层报错

如何正确解决:

两种方案吧
第一种
直接物理删除,但是当遇到一些比较"正常"的需求时,比如说数据备份,或者关键表仍可查询的时候,这种方法就不太明智了。
第二种
额外维护一个字段del_unique_key,三个字段合在一起作为唯一键,其中del_unique_key初始化默认为0,当删除的时候将这个字段维护为id(uuid)。 重新走一下流程,
思路很简单,重要的是开发的可以考虑到这种问题与否。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值