V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
alienx717
V2EX  ›  程序员

删除数据库记录前是否有必要先查看记录是否存在

  •  
  •   alienx717 · 2019-06-12 12:13:56 +08:00 · 4931 次点击
    这是一个创建于 2002 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1.通过 ID 获取记录
    2.判断是否存在
    存在?删除:不操作
    是否有必要这样,还是直接删,不去查询是否存在。
    17 条回复    2019-06-12 18:39:09 +08:00
    gavindexu
        1
    gavindexu  
       2019-06-12 12:20:30 +08:00 via iPhone   ❤️ 1
    为什么要删除,标记一下不就好了…
    gu0ka1
        2
    gu0ka1  
       2019-06-12 12:22:46 +08:00
    数据订正,先备份下,再直接删
    lowman
        3
    lowman  
       2019-06-12 12:26:24 +08:00
    删库跑路!
    hubqin
        4
    hubqin  
       2019-06-12 12:29:29 +08:00 via Android
    觉得没必要,如果删除的数据不存在,会返回 0
    zhuangzhuang1988
        5
    zhuangzhuang1988  
       2019-06-12 12:32:56 +08:00
    加入 limit 1
    lihongjie0209
        6
    lihongjie0209  
       2019-06-12 12:39:59 +08:00
    用户初始化一个工单, 如果这个工单没有被指派, 那么用户可以取消(删除), 如果被指派了, 不能取消.


    你如果不检测状态, 怎么删除?
    wd
        7
    wd  
       2019-06-12 13:42:09 +08:00 via iPhone
    @lihongjie0209 #6 一般设计里面不会取消也不会删除的,改一下状态就可以了。
    Caballarii
        8
    Caballarii  
       2019-06-12 13:45:07 +08:00
    一般不做 delete 操作,而是用字段代表是否被删除
    lihongjie0209
        9
    lihongjie0209  
       2019-06-12 13:56:09 +08:00
    @wd 哪怕是改状态, 你也不应该把不可以删除的数据标记为删除. 你的程序要做业务校验的
    alienx717
        10
    alienx717  
    OP
       2019-06-12 14:01:09 +08:00
    @lihongjie0209 @wd @Caballarii @hubqin @gavindexu @zhuangzhuang1988
    其实是这样,先 delete,然后重新 insert 的一个场景,这套操作在修改的接口里面,我看先查询一遍再删除,觉得没必要,因为没相应记录删除也不会报错(代码不是我写的)
    jusalun
        11
    jusalun  
       2019-06-12 14:01:27 +08:00
    一般是有个 status 字段标识记录是否有效

    各家公司生产上但凡是专业 dba 设计的数据库架构都不会有删除操作,一般删数据这种多见于开发神魔乱舞
    wd
        12
    wd  
       2019-06-12 14:04:31 +08:00 via iPhone
    @lihongjie0209 #9 数据一般都是不可以删除的,因为数据之间一旦加了约束之后,删除是会破坏约束的,而且用户老板的各种不确定性,保留数据可以用来查历史,甚至必要的时候恢复这个数据。和写程序里面的不能写死累死。你说的程序需要做校验我理解是说需要代码识别这样的数据做不同处理吗?那这个自然是需要做的。
    wd
        13
    wd  
       2019-06-12 14:06:22 +08:00 via iPhone
    @alienx717 #10 就你说的这个,如果确实没有什么特殊的要求,那直接删就可以,我觉得不用先查一下.
    chotow
        14
    chotow  
       2019-06-12 14:06:46 +08:00 via iPhone   ❤️ 1
    做硬删除反而「不是正道」,这个世道 🤷‍♂️
    dilu
        15
    dilu  
       2019-06-12 14:15:31 +08:00 via Android
    从来没见过真删除,都是软删
    libook
        16
    libook  
       2019-06-12 15:35:41 +08:00
    在高并发场景下可能出现两个进程同时查询同一条数据是否存在,两个进程可能同时查出来这一条数据存在,然后同时执行删除,一个成功删除了,另一个没有成功删除,只是一般也不会报错就是了。

    所以……先查询后删除的原因是什么呢?如果是从性能上来说,先查询后删除性能比直接删除多一步,直接删除如果没有记录也不会执行写操作(数据库一般都会 对各种已知情况做足优化的);从逻辑上来说,删除操作时幂等的,即不管删除前有没有数据,执行删除后的结果都是一致的。

    所以我的答案是:直接删就可以了。
    liuzhen
        17
    liuzhen  
       2019-06-12 18:39:09 +08:00
    逻辑删除不就是查出来再“删”
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5699 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:02 · PVG 11:02 · LAX 19:02 · JFK 22:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.