5. DELETE 与 TRUNCATE 的区别

两者都能"清空表",但差别很大:

对比DELETE(不带 WHERE)TRUNCATE
是否可加条件可以加 WHERE 删部分不行,只能全清空
底层动作逐行删除,记录日志直接释放整表数据页
自增列不重置,继续往后排重置回初始值
速度相对慢(行多时)非常快
可回滚在事务中可回滚多数情况不可回滚
sql
-- 清空选课表(保留结构,自增重置)
TRUNCATE TABLE sc;
💡 一句话:想删"部分数据"用 DELETE + WHERE;想"连表带数据重置"用 TRUNCATE。日常练习清空测试表用 TRUNCATE 最快。

📝 本节例题

以下例题均基于 教学实例 库(student / course / sc / teacher / grades / dept / emp),开始前先执行 USE 教学实例;。建议先自己写一遍,再展开答案对照。

例 1
用 DELETE 清空 sc_bak 表,并确认剩余行数。
查看参考答案(可复制)
sql
DELETE FROM sc_bak;
SELECT COUNT(*) FROM sc_bak;
💡 DELETE 是 DML,逐行删除,可以带 WHERE,也可以回滚。
例 2
改用 TRUNCATE 清空 sc_bak 表,说说它与 DELETE 的区别。
查看参考答案(可复制)
sql
TRUNCATE TABLE sc_bak;
💡 TRUNCATE 是 DDL:不能带条件、不走事务日志、自增值重置、速度更快。
例 3
做一次对比实验:建带自增的 t 表,插入 3 行 → DELETE 后再插 1 行(编号应为 4)→ TRUNCATE 后再插 1 行(编号回到 1)。
查看参考答案(可复制)
sql
CREATE TABLE t (id int PRIMARY KEY AUTO_INCREMENT, name varchar(10));
INSERT INTO t(name) VALUES('a'), ('b'), ('c');

DELETE FROM t;
INSERT INTO t(name) VALUES('d');
SELECT * FROM t;      -- id = 4

TRUNCATE TABLE t;
INSERT INTO t(name) VALUES('e');
SELECT * FROM t;      -- id = 1
💡 这道题把两者的核心差异(自增值是否重置)一次性跑出来。