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

2019-06-12 12:13:56 +08:00
 alienx717
1.通过 ID 获取记录
2.判断是否存在
存在?删除:不操作
是否有必要这样,还是直接删,不去查询是否存在。
4682 次点击
所在节点    程序员
17 条回复
gavindexu
2019-06-12 12:20:30 +08:00
为什么要删除,标记一下不就好了…
gu0ka1
2019-06-12 12:22:46 +08:00
数据订正,先备份下,再直接删
lowman
2019-06-12 12:26:24 +08:00
删库跑路!
hubqin
2019-06-12 12:29:29 +08:00
觉得没必要,如果删除的数据不存在,会返回 0
zhuangzhuang1988
2019-06-12 12:32:56 +08:00
加入 limit 1
lihongjie0209
2019-06-12 12:39:59 +08:00
用户初始化一个工单, 如果这个工单没有被指派, 那么用户可以取消(删除), 如果被指派了, 不能取消.


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

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

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

所以我的答案是:直接删就可以了。
liuzhen
2019-06-12 18:39:09 +08:00
逻辑删除不就是查出来再“删”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/573130

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX