TRUNCATE 关键字介绍
📅 2026/7/13 17:00:34
👁️ 阅读次数
📝 编程学习
在 MySQL 中,TRUNCATE有两个完全不同的用途,需要根据上下文区分:
一、TRUNCATE TABLE —— 清空表数据
语法
sql
TRUNCATE TABLE 表名;
作用
删除表中的所有数据,但保留表结构(字段、索引、约束等)
相当于执行了
DELETE FROM 表名(不带 WHERE),但速度更快
特点对比
| 特性 | TRUNCATE | DELETE |
|---|---|---|
| 删除所有数据 | ✅ | ✅(不带 WHERE) |
| 保留表结构 | ✅ | ✅ |
| 执行速度 | 极快 | 较慢(逐行删除) |
| 重置自增 ID | ✅ 重置为初始值 | ❌ 不重置 |
| 可回滚(事务中) | ❌ 不可回滚(DDL 操作) | ✅ 可回滚 |
| 触发行级触发器 | ❌ 不触发 | ✅ 触发 |
| 释放磁盘空间 | ✅ 释放 | ❌ 不释放(需要 OPTIMIZE) |
| 锁定方式 | 表级锁 | 行级锁 |
使用示例
sql
-- 清空 user 表的所有数据 TRUNCATE TABLE user; -- 只保留表结构,所有数据被删除,自增 ID 从 1 重新开始 INSERT INTO user (name) VALUES ('张三'); -- id = 1⚠️ 注意事项
TRUNCATE 是 DDL(数据定义语言)操作,不是 DML,无法回滚(即使在事务中)
如果有外键约束指向该表,
TRUNCATE可能会报错:sql
-- 错误示例 TRUNCATE TABLE orders; -- 如果 orders 表有子表引用,会报错: -- Cannot truncate a table referenced in a foreign key constraint
解决方法:先删除外键约束,或用
DELETE代替无法带 WHERE 条件,必须全表清空
执行后,自增主键计数器会重置
二、TRUNCATE() —— 截断数字或日期
1. 截断数字(保留指定小数位)
sql
TRUNCATE(X, D)
X:要处理的数字D:保留的小数位数D > 0:保留 D 位小数D = 0:保留整数部分D < 0:将整数部分从倒数第 |D| 位开始归零
sql
SELECT TRUNCATE(123.4567, 2); -- 结果: 123.45 SELECT TRUNCATE(123.4567, 0); -- 结果: 123 SELECT TRUNCATE(123.4567, -1); -- 结果: 120 SELECT TRUNCATE(123.4567, -2); -- 结果: 100 SELECT TRUNCATE(-123.4567, 2); -- 结果: -123.45
与ROUND()的区别:
TRUNCATE():直接截断,不四舍五入ROUND():四舍五入
sql
SELECT TRUNCATE(123.4567, 2); -- 123.45 SELECT ROUND(123.4567, 2); -- 123.46
2. 截断日期(MySQL 8.0+)
sql
TRUNCATE(date, unit)
将日期按指定单位截断到该单位的开始边界
sql
SELECT TRUNCATE(NOW(), 'YEAR'); -- 2026-01-01 00:00:00 SELECT TRUNCATE(NOW(), 'MONTH'); -- 2026-07-01 00:00:00 SELECT TRUNCATE(NOW(), 'DAY'); -- 2026-07-13 00:00:00 SELECT TRUNCATE(NOW(), 'HOUR'); -- 2026-07-13 14:00:00
与DATE_FORMAT()对比:
sql
-- 获取当月第一天 SELECT TRUNCATE(NOW(), 'MONTH'); -- 更简洁 SELECT DATE_FORMAT(NOW(), '%Y-%m-01'); -- 传统写法
三、快速参考
| 用法 | 语法 | 作用 | 示例 |
|---|---|---|---|
| 清空表 | TRUNCATE TABLE 表名 | 删除所有数据,重置自增 | TRUNCATE TABLE users; |
| 截断数字 | TRUNCATE(数字, 小数位) | 截断小数位,不四舍五入 | TRUNCATE(3.14159, 2)→ 3.14 |
| 截断日期 | TRUNCATE(日期, 单位) | 截断到日期边界 | TRUNCATE(NOW(), 'DAY')→ 当天 00:00:00 |
总结
如果你的上下文是操作数据库表→ 用的是
TRUNCATE TABLE,用来快速清空表如果你的上下文是处理数值或日期→ 用的是
TRUNCATE()函数,用来截断数字小数位或日期精度
编程学习
技术分享
实战经验