今天就来唠唠我捣鼓 deletesql
这事儿,也就是咱平时说的用 SQL 删数据那点儿操作。
开始前的准备
最近,我们那个测试库里头,堆一堆乱七八糟的测试数据,是之前做功能验证时候留下来的。时间长,越积越多,看着也碍眼,而且有时候还会影响新的测试。所以我就琢磨着得把这些没用的数据给清理掉。
目标明确,就是用 DELETE
语句把特定条件下的一些记录给删。听起来简单是?但每次碰 DELETE
,我这心里头都得先打个鼓。
为啥心里打鼓
主要是这玩意儿太猛。不像是写代码,错还能改,还能回滚。这数据库里的数据,特别是生产环境的,DELETE
一执行,要是没备份,那可就真没,找都找不回来。以前就听同事说过,有人手一抖,WHERE
条件没写对,或者压根忘写 WHERE
,那结果简直就是灾难现场。
就算是在测试库里操作,我也养成个习惯,必须得小心点。
我的实践步骤
第一步,我肯定不是直接上去就写 DELETE FROM 表名 WHERE 条件
。不行,这风险太大。
我的老习惯是,先用 SELECT
探探路。我会把我想用的 WHERE
条件,先放在一个 SELECT FROM 表名 WHERE ...
语句里头。执行一下这个 SELECT
语句,看看它到底会选出来哪些数据。
仔细瞅瞅查出来的结果,一条条对一下,是不是真的都是我要删的那些?
有没有哪些是不该删的,被这个条件误伤?
数据量对不对?是不是符合我的预期?
这一步贼关键,真的,能救命。多花几分钟确认一下,心里踏实。
确认无误,才动手删。 等我确认 SELECT
查出来的数据,确实就是我想干掉的那些,不多也不少,完全精确匹配。这时候,我才把刚才那条 SELECT
语句复制一下,然后小心翼翼地把 SELECT
替换成 DELETE
。
变成这样:DELETE FROM 表名 WHERE ...
(这里的 WHERE
条件跟刚才 SELECT
验证时用的是一模一样的)。
然后,执行 DELETE
。执行的时候,眼睛都不敢眨,盯着那个执行结果,看它提示我删多少行。这个数字,得跟我刚才用 SELECT
查出来的记录数对得上,这才算安心。
还得检查一遍
删完还不算完事。我会再用之前的那个 SELECT
语句查一遍。这回预期查出来的结果应该是空的,或者说,那些目标数据确实不见。这样才算真正完成清理工作。
关于 `TRUNCATE`
有时候如果要删整个表的数据,而不是一部分,可能会想到用 TRUNCATE TABLE 表名
。这玩意儿确实快,哗一下就清空,据说效率比一行行 DELETE
高多。但它更狠,没法带 WHERE
条件,而且恢复起来更麻烦(或者说基本没法恢复)。所以用它的时候更得想清楚,是不是真的要把整个表的数据都清掉。
一点小结
用 DELETE
这命令,真不是闹着玩的。数据库操作,特别是删数据这种,谨慎点总没错。我这套“先查后删再复查”的流程,虽然麻烦点,但能最大程度避免手滑搞出大问题。毕竟数据安全比啥都重要,对?