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💡 这道题把两者的核心差异(自增值是否重置)一次性跑出来。