5.3 DELETE 删除数据


5.3 DELETE 删除数据

本节摘要:DELETE 删除行。本节讲 DELETE 语法、WHERE 限定、和 TRUNCATE 的区别,以及删除的安全习惯和不可恢复的风险。

本节导读

阅读完本节,你应当能够:

  1. 写 DELETE 语句删行
  2. 区分 DELETE 和 TRUNCATE
  3. 理解删除的不可恢复性
  4. 养成删除的安全习惯

一、基本语法

DELETE FROM 表名 WHERE 条件;

WHERE 限定删哪些行。不加 WHERE 删全表所有行:

-- 删除 101 号客户 DELETE FROM Customers WHERE CustomerID = 101; -- 删除金额小于 10 的订单 DELETE FROM Orders WHERE Amount < 10;

二、DELETE vs TRUNCATE

两者都能清空表,但有重要区别:

维度 DELETE TRUNCATE
范围 可带 WHERE 删部分 只能删全表
速度 逐行删,慢 直接清空,快
事务 可回滚(事务内) 部分 DBMS 不可回滚
自增列 不重置 重置
触发器 触发 不触发
计入行数 返回删除行数 不返回
DELETE FROM Customers; -- 逐行删全表,慢,可回滚 TRUNCATE TABLE Customers; -- 直接清空,快,自增重置

清空全表用 TRUNCATE 更快;删部分行只能用 DELETE。

三、删除的不可恢复性

DELETE 删掉的数据默认不可恢复——除非在事务里还没 COMMIT 可以 ROLLBACK,或有备份。删除前务必:

  1. 先 SELECT 验证:用同样 WHERE 看要删哪些行。
  2. 事务包裹BEGIN; DELETE...; 确认无误 COMMIT,有错 ROLLBACK
  3. 重要数据先备份:或用"软删除"(加删除标记列)代替物理删除。
-- 第 1 步:看要删什么 SELECT * FROM Orders WHERE Amount < 10; -- 第 2 步:确认后删 DELETE FROM Orders WHERE Amount < 10;

四、软删除 vs 硬删除

很多生产系统不真删数据,而是加个 is_deleted 标记列,"删除"只是把标记改成 1:

-- 软删除:改标记 UPDATE Customers SET is_deleted = 1 WHERE CustomerID = 101; -- 查询时过滤已删的 SELECT * FROM Customers WHERE is_deleted = 0;

软删除好处:可恢复、保留审计、不破坏外键关系。代价是数据累积、查询要带过滤。重要业务多用软删除。

五、删除的常见坑

  • 忘写 WHERE 删全表:和 UPDATE 一样的头号事故。
  • 外键约束阻止:删被引用的行报错(有子记录依赖)。
  • 级联删除连锁ON DELETE CASCADE 会连带删子表数据,慎用。
  • 大表 DELETE 锁表:删大量行会长时间锁表,影响业务,分批删。

⚠️ 常见坑:DELETE 忘写 WHERE 删全表,且 DELETE 删掉不可恢复(除非事务未提交或有备份)。删除前先 SELECT 验证、事务包裹、重要数据用软删除。

💡 关键直觉:DELETE 删的是行,TRUNCATE 清的是表。删除不可恢复,先验证、事务包裹、重要数据软删除。大表删除分批,避免长锁。

本节速览

  • DELETEDELETE FROM 表 WHERE 条件,WHERE 限定删哪些行,不加删全表。
  • vs TRUNCATE:DELETE 可带 WHERE、慢、可回滚;TRUNCATE 只清全表、快、重置自增、不触发器。
  • 不可恢复:删掉默认回不来,事务未提交可 ROLLBACK,否则靠备份。
  • 软删除:用 is_deleted 标记代替物理删,可恢复、留审计,重要业务多用。
  • :忘 WHERE 删全表、外键约束、级联删除、大表长锁。
  • 安全:先 SELECT 验证 → 事务包裹 → 重要数据软删除 → 大表分批删。

第 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) 软删除。理解外键约束的"保护"作用,别把报错当麻烦。

动手做一做

删除是最需要谨慎的操作,建议用一次"可控的实验"来加深理解。

准备一张练习表,插入若干行数据。

第一步,用条件查询把准备删除的行选出来,确认范围无误。

第二步,把查询改写成删除语句,限定条件执行,观察删除了多少行。

第三步,对比清空操作和逐行删除的区别:在一个测试表上分别执行这两种方式,观察结果行数、是否重置自增列、以及速度差异,理解两者适用场景的不同。

第四步,体验软删除的思路:给练习表加一个标记列,删除时只更新标记,查询时过滤掉已标记的行。体会"不真删、只标记"这种工程实践的思路。

第五步,把删除操作放进事务里执行,查看影响行数,再回滚,观察数据恢复原状,理解事务对删除的保护作用。

这五步做完,你会清楚认识到:删除不可逆,删前要预览,范围条件是生命线,软删除是更稳妥的选择。这些认知,比任何提醒都有分量。

一句话记忆

删除是数据操作的收尾,也是最危险的一环。范围条件限定删哪些行,清空操作用于整表清空,软删除用标记代替真删。删前预览、事务保护、能软删就软删,这三条是保命原则。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U