发布于2026-07-09 阅读(0)
扫一扫,手机访问
说实话,用 DELETE 配合 WHERE 删数据这事儿,看似简单,翻车案例可一点不少。说到底,核心就一句话:先确认、再删除、有回退。语法真不复杂,复杂的是你得把条件写准了,还得保证删得安全。
无效数据不是凭感觉就能定的,它得能用字段值说清楚。常见的几种,基本跑不出下面这几类:
第一步:先跑 SELECT,确认 WHERE 条件打在谁身上
别急着敲 DELETE,先拿同样的条件跑一条 SELECT 看看。目标数据对不对,数量对不对,一眼就能确认。这一步是兜底的。
SELECT * FROM orders WHERE status = 'cancelled' AND created_at < '2022-01-01';
第二步:在事务里执行 DELETE
确认无误后,把 DELETE 包进事务里。这样万一删错了、删多了,一个 ROLLBACK 就能救回来,不用拍大腿后悔。
START TRANSACTION;
DELETE FROM orders WHERE status = 'cancelled' AND created_at < '2022-01-01';
-- 检查影响行数,没问题再提交
COMMIT;
第三步:备份与留痕
删之前最好把数据导出来存一份,至少保留7天。同时把删除语句、执行时间、影响行数都记到日志里。事后追查时,这就是证据。
DELETE FROM logs WHERE created_at < '2021-01-01' ORDER BY id LIMIT 10000;DELETE FROM goods_show WHERE id IN (SELECT id FROM (SELECT id FROM goods_show LEFT JOIN goods ON ... WHERE goods.id IS NULL) AS tmp);对于核心业务表,建议优先考虑软删除。说白了就是不真删,只是更新一个标记字段。
UPDATE users SET is_deleted = 1, deleted_at = NOW() WHERE last_login < '2020-01-01';
之后所有查询都加上 AND is_deleted = 0 的条件过滤。这样既释放了“逻辑上”的无效数据,又保留了完整恢复的能力,也避免了触发器或级联删除带来的连锁反应。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8