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. 这需要确保这样处理的表都有逻辑主键
  • 相关阅读:
    LintCode-35.翻转链表
    LintCode-159.寻找旋转排序数组中的最小值
    LintCode-73.前序遍历和中序遍历树构造二叉树
    LintCode-9.Fizz Buzz 问题
    NOI 2018 归程 (Kruskal重构树)
    模板 NTT 快速数论变换
    模板 FFT 快速傅里叶变换
    BZOJ 3510 首都 (LCT)
    BZOJ 4530 [BJOI2014]大融合 (LCT)
    BZOJ 3282 Link Cut Tree (LCT)
  • 原文地址:https://www.cnblogs.com/lovling/p/12735820.html
Copyright © 2011-2022 走看看