• 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. 这需要确保这样处理的表都有逻辑主键
  • 相关阅读:
    [小技巧]记录PHP错误日志
    PHP __autoload函数(自动载入类文件)的使用方法
    php5.3以前的版本安装出现Fatal error: Call to undefined function mysql_connect()
    mysqlnoinstall5.1.62win32 安装
    [php]PHP错误处理
    哈希表1
    哈希表2
    WinSock編程的多線程式控制
    编码转换 unicode gbk big5
    Parameters转换为Variant数组
  • 原文地址:https://www.cnblogs.com/lovling/p/12735820.html
Copyright © 2020-2023  润新知