1,问题
- 我们在日常开发中,由于一些安全性考虑,我们做数据库删除的时候,并不会把数据删除,而是通过一个字段作为标记,比如 is_delete ,为 0 时为正常,为 1 时为删除,这种模式
- 但这就引发了一个问题,如果数据表中存在一个需要唯一性约束的字段,比如 用户账号,当我们插入过一次某个账号后采用逻辑删除,在次插入的时候,会出现违反唯一性约束的错误
2,办法
1,在程序中判断,不做数据库约束
- 数据库不做约束,直接在程序中每次新增的时候,判断唯一性
- 注意该种方式在分布式高并发的项目中,需要采用事物才能确保数据的唯一性
2,逻辑删除字段 加一 法
- 设置 is_delete 为 0 时为正常 大于 0 时为被删除
- 将唯一性约束的字段 和 is_delete 共同做唯一性约束
- 比如 account 为唯一性约束字段,第一次插入账号时做删除,给 is_delete 修改为 1,第二次再次插入相同账号然后做删除 就设置为 2,依次类推
3,自增序列作为 is_delete 的赋值来源
- 设置 is_delete 为 0 时为正常 大于 0 时为被删除
- 将唯一性约束的字段 和 is_delete 共同作为唯一性约束的字段
- 创建一个序列,每次做逻辑删除时,获取序列值赋值给 is_delete 字段
4,逻辑主键 赋值给 is_delete 字段(推荐使用)
- 设置 is_delete 为 0 时为正常 不为 0 时为被删除
- 将唯一性约束的字段 和 is_delete 共同作为唯一性约束的字段
- 对于被逻辑删除的数据,is_delete 字段 赋予主键的值(update tb set is_delete = id where id = 123)
- 这需要确保这样处理的表都有逻辑主键
posted on
2020-04-20 09:09
被遗忘的优雅
阅读(
870)
评论()
编辑
收藏
举报