清空表数据
2025/6/13大约 2 分钟
在 SQL 中,清空表数据有两种主要方式:TRUNCATE TABLE 和 DELETE FROM。它们的功能和适用场景有所不同,下面为你详细介绍:
一、使用 TRUNCATE TABLE(推荐快速清空)
语法:
TRUNCATE TABLE table_name;特点:
- 快速高效:直接删除数据页,不逐行记录日志,比
DELETE快得多 - 不可回滚:操作立即生效,无法通过
ROLLBACK恢复 - 重置自增主键:如果表有自增列(如
AUTO_INCREMENT),会重置为初始值 - 不触发触发器:不会触发表上的
DELETE触发器
示例:
TRUNCATE TABLE users; -- 清空 users 表的所有数据-- 1. 禁用外键约束
SET FOREIGN_KEY_CHECKS = 0;
-- 2. 执行TRUNCATE
TRUNCATE TABLE news_type_relation;
-- 3. 重新启用外键约束
SET FOREIGN_KEY_CHECKS = 1;
二、使用 DELETE FROM(灵活删除)
语法:
DELETE FROM table_name [WHERE condition];特点:
- 可带条件:通过
WHERE子句选择性删除数据(如WHERE id > 100) - 逐行删除:逐行记录日志,适合需要事务控制的场景
- 可回滚:在事务中执行时,可以通过
ROLLBACK撤销 - 保留自增主键:自增列的值不会重置,继续递增
- 触发触发器:会触发表上的
DELETE触发器
示例:
-- 清空全量数据(不带 WHERE)
DELETE FROM users;
-- 条件删除(只删除活跃用户)
DELETE FROM users WHERE status = 'active';四、注意事项
权限要求:
TRUNCATE需要DROP权限(因为本质是重建表)DELETE只需要DELETE权限
外键约束:
- 如果表有外键关联,
TRUNCATE可能失败(需先禁用外键约束)
-- 禁用外键约束(MySQL) SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE orders; SET FOREIGN_KEY_CHECKS = 1;- 如果表有外键关联,
分区表:
TRUNCATE会删除所有分区的数据- 若需清空特定分区,使用
ALTER TABLE ... TRUNCATE PARTITION
视图和索引:
- 两者都不会删除表结构、视图或索引
五、清空表并重置自增ID的其他方法
- 使用
ALTER TABLE(MySQL):
ALTER TABLE table_name AUTO_INCREMENT = 1; -- 重置自增ID为1- 删除并重建表:
DROP TABLE table_name;
CREATE TABLE table_name (...); -- 重新创建表