1. 基本知识
TRUNCATE 是 MySQL 中用于快速删除表中所有行的 SQL 命令
它不同于 DELETE 命令,TRUNCATE 不会逐行删除数据,而是快速地释放表的存储空间
优缺点 | TRUNCATE | DELETE |
---|---|---|
速度 | 更快,因为它不会逐行删除,直接重置表 | 较慢,逐行删除,可能会触发触发器 |
日志记录 | 较少,只记录页的释放,而不是每行 | 每行操作都记录到日志中 |
事务 | 不可回滚,不能在事务中使用 | 可回滚,可以在事务中使用 |
自增计数 | 重置自增计数 | 不会重置自增计数 |
触发器 | 不会触发触发器 | 会触发触发器 |
外键约束 | 需要删除所有引用 | 可以删除部分行,只要遵循外键约束 |
注意事项
- 不可恢复:使用 TRUNCATE 删除的数据无法恢复,因此在执行此命令前需要谨慎
- 外键约束:如果表有外键引用,TRUNCATE 可能会失败,除非删除引用的外键关系
- 权限要求:执行 TRUNCATE 需要对表的 DROP 权限
- 自增字段:TRUNCATE 会将自增字段重置为初始值
2. Demo
-- 创建一个示例表
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
-- 插入示例数据
INSERT INTO employees (name) VALUES ('Alice'), ('Bob'), ('Charlie');
-- 查看表中的数据
SELECT * FROM employees;
-- 使用 TRUNCATE 清空表
TRUNCATE TABLE employees;
-- 查看表中的数据
SELECT * FROM employees; -- 结果将为空
TRUNCATE 与其他方法的对比
方法 | 用法 | 特点 |
---|---|---|
TRUNCATE | TRUNCATE TABLE table_name | 快速删除所有行,重置自增计数,不可回滚 |
DELETE | DELETE FROM table_name | 删除特定行或所有行,可回滚,触发器会被触发 |
DROP | DROP TABLE table_name | 删除整个表及其结构,不可恢复 |
通过上面的对比,可以选择合适的命令来满足特定的需求