zoukankan      html  css  js  c++  java
  • 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. 这需要确保这样处理的表都有逻辑主键
  • 相关阅读:
    阻塞队列之LinkedTransferQueue
    BlockingQueue drainTo()
    jedis常用API
    在Redis集群中使用pipeline批量插入
    序列化
    springmvc单文件上传
    hibernateValidate
    springmvc使用spring自带日期类型验证
    springmvc自定义日期编辑器
    springmvc__SimpleUrlHandlerMapping(对访问地址进行加工,以键值对的形式)
  • 原文地址:https://www.cnblogs.com/lovling/p/12735820.html
Copyright © 2011-2022 走看看