删除数据库记录前是否有必要先查看记录是否存在 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
alienx717
V2EX    程序员

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

  •  
  •   aliex717 2019-06-12 12:13:56 +08:00 5380 次点击
    这是一个创建于 2312 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     2974 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:11 PVG 20:11 LAX 05:11 JFK 08:11
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86