问题:sql唯一键设计
把数据库中某一个字段设置成唯一键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)。 重新走一下流程,
思路很简单,重要的是开发的可以考虑到这种问题与否。