oracle 唯一新约束 和 逻辑删除的 冲突处理办法

1,问题

  1. 我们在日常开发中,由于一些安全性考虑,我们做数据库删除的时候,并不会把数据删除,而是通过一个字段作为标记,比如 is_delete ,为 0 时为正常,为 1 时为删除,这种模式
  2. 但这就引发了一个问题,如果数据表中存在一个需要唯一性约束的字段,比如 用户账号,当我们插入过一次某个账号后采用逻辑删除,在次插入的时候,会出现违反唯一性约束的错误

2,办法

1,在程序中判断,不做数据库约束

  1. 数据库不做约束,直接在程序中每次新增的时候,判断唯一性
  2. 注意该种方式在分布式高并发的项目中,需要采用事物才能确保数据的唯一性

2,逻辑删除字段 加一 法

  1. 设置 is_delete 为 0 时为正常 大于 0 时为被删除
  2. 将唯一性约束的字段 和 is_delete 共同做唯一性约束
  3. 比如 account 为唯一性约束字段,第一次插入账号时做删除,给 is_delete 修改为 1,第二次再次插入相同账号然后做删除 就设置为 2,依次类推

3,自增序列作为 is_delete 的赋值来源

  1. 设置 is_delete 为 0 时为正常 大于 0 时为被删除
  2. 将唯一性约束的字段 和 is_delete 共同作为唯一性约束的字段
  3. 创建一个序列,每次做逻辑删除时,获取序列值赋值给 is_delete 字段

4,逻辑主键 赋值给 is_delete 字段(推荐使用)

  1. 设置 is_delete 为 0 时为正常 不为 0 时为被删除
  2. 将唯一性约束的字段 和 is_delete 共同作为唯一性约束的字段
  3. 对于被逻辑删除的数据,is_delete 字段 赋予主键的值(update tb set is_delete = id where id = 123)
  4. 这需要确保这样处理的表都有逻辑主键
原文地址:https://www.cnblogs.com/lovling/p/12735820.html