本节摘要:DELETE 删除行。本节讲 DELETE 语法、WHERE 限定、和 TRUNCATE 的区别,以及删除的安全习惯和不可恢复的风险。
阅读完本节,你应当能够:
DELETE FROM 表名 WHERE 条件;
WHERE 限定删哪些行。不加 WHERE 删全表所有行:
-- 删除 101 号客户 DELETE FROM Customers WHERE CustomerID = 101; -- 删除金额小于 10 的订单 DELETE FROM Orders WHERE Amount < 10;
两者都能清空表,但有重要区别:
| 维度 | DELETE | TRUNCATE |
|---|---|---|
| 范围 | 可带 WHERE 删部分 | 只能删全表 |
| 速度 | 逐行删,慢 | 直接清空,快 |
| 事务 | 可回滚(事务内) | 部分 DBMS 不可回滚 |
| 自增列 | 不重置 | 重置 |
| 触发器 | 触发 | 不触发 |
| 计入行数 | 返回删除行数 | 不返回 |
DELETE FROM Customers; -- 逐行删全表,慢,可回滚 TRUNCATE TABLE Customers; -- 直接清空,快,自增重置
清空全表用 TRUNCATE 更快;删部分行只能用 DELETE。
DELETE 删掉的数据默认不可恢复——除非在事务里还没 COMMIT 可以 ROLLBACK,或有备份。删除前务必:
BEGIN; DELETE...; 确认无误 COMMIT,有错 ROLLBACK。-- 第 1 步:看要删什么 SELECT * FROM Orders WHERE Amount < 10; -- 第 2 步:确认后删 DELETE FROM Orders WHERE Amount < 10;
很多生产系统不真删数据,而是加个 is_deleted 标记列,"删除"只是把标记改成 1:
-- 软删除:改标记 UPDATE Customers SET is_deleted = 1 WHERE CustomerID = 101; -- 查询时过滤已删的 SELECT * FROM Customers WHERE is_deleted = 0;
软删除好处:可恢复、保留审计、不破坏外键关系。代价是数据累积、查询要带过滤。重要业务多用软删除。
ON DELETE CASCADE 会连带删子表数据,慎用。⚠️ 常见坑:DELETE 忘写 WHERE 删全表,且 DELETE 删掉不可恢复(除非事务未提交或有备份)。删除前先 SELECT 验证、事务包裹、重要数据用软删除。
💡 关键直觉:DELETE 删的是行,TRUNCATE 清的是表。删除不可恢复,先验证、事务包裹、重要数据软删除。大表删除分批,避免长锁。
DELETE FROM 表 WHERE 条件,WHERE 限定删哪些行,不加删全表。is_deleted 标记代替物理删,可恢复、留审计,重要业务多用。第 5 章结束。增删改三件套掌握,且知道每条的危险点。下一章讲怎么建表改表——DDL。
Q1:DELETE 和 TRUNCATE 怎么选?
要删部分行就用 DELETE(带 WHERE);要清空整表且想重置自增就用 TRUNCATE(更快,但 MySQL 下不可按行回滚,且不触发删除触发器)。总结:删一部分用 DELETE,整表清空用 TRUNCATE。
Q2:DELETE 删掉的数据能恢复吗?
事务未提交时 ROLLBACK 可恢复;已提交后,只能靠备份/日志恢复,且恢复复杂。所以"删除前备份"不是口号,是保命手段。线上敏感数据删除,要么软删除,要么备份后删。
Q3:什么是软删除?为什么常用?
软删除是不真删数据,加一个 is_deleted(或 deleted_at)字段标记。查询时过滤掉已删的。好处:可随时恢复、保留历史审计、避免外键连锁问题。代价:数据量积累、每条查询要带过滤条件。很多企业级系统默认软删除,务必掌握这个模式。
Q4:DELETE 大表慢、锁表怎么办?
分批删除:DELETE ... WHERE id BETWEEN ... 或按主键循环删,每批几百到几千行,批间短暂停顿。避免单条 DELETE 扫描整个表长时间持锁。
Q5:外键关联的行能直接删吗?
被外键引用的父行,直接删会报错(参照完整性)。处理方式:1) 先删子行再删父行;2) 建表时用 ON DELETE CASCADE 自动级联(慎用,会连删);3) 软删除。理解外键约束的"保护"作用,别把报错当麻烦。
删除是最需要谨慎的操作,建议用一次"可控的实验"来加深理解。
准备一张练习表,插入若干行数据。
第一步,用条件查询把准备删除的行选出来,确认范围无误。
第二步,把查询改写成删除语句,限定条件执行,观察删除了多少行。
第三步,对比清空操作和逐行删除的区别:在一个测试表上分别执行这两种方式,观察结果行数、是否重置自增列、以及速度差异,理解两者适用场景的不同。
第四步,体验软删除的思路:给练习表加一个标记列,删除时只更新标记,查询时过滤掉已标记的行。体会"不真删、只标记"这种工程实践的思路。
第五步,把删除操作放进事务里执行,查看影响行数,再回滚,观察数据恢复原状,理解事务对删除的保护作用。
这五步做完,你会清楚认识到:删除不可逆,删前要预览,范围条件是生命线,软删除是更稳妥的选择。这些认知,比任何提醒都有分量。
删除是数据操作的收尾,也是最危险的一环。范围条件限定删哪些行,清空操作用于整表清空,软删除用标记代替真删。删前预览、事务保护、能软删就软删,这三条是保命原则。