TRUNCATE 关键字介绍
在 MySQL 中TRUNCATE有两个完全不同的用途需要根据上下文区分一、TRUNCATE TABLE —— 清空表数据语法sqlTRUNCATE TABLE 表名;作用删除表中的所有数据但保留表结构字段、索引、约束等相当于执行了DELETE FROM 表名不带 WHERE但速度更快特点对比特性TRUNCATEDELETE删除所有数据✅✅不带 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. 截断数字保留指定小数位sqlTRUNCATE(X, D)X要处理的数字D保留的小数位数D 0保留 D 位小数D 0保留整数部分D 0将整数部分从倒数第 |D| 位开始归零sqlSELECT 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()四舍五入sqlSELECT TRUNCATE(123.4567, 2); -- 123.45 SELECT ROUND(123.4567, 2); -- 123.462. 截断日期MySQL 8.0sqlTRUNCATE(date, unit)将日期按指定单位截断到该单位的开始边界sqlSELECT 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()函数用来截断数字小数位或日期精度