TRUNCATE 关键字介绍

📅 2026/7/13 17:00:34 👁️ 阅读次数 📝 编程学习
TRUNCATE 关键字介绍

在 MySQL 中,TRUNCATE有两个完全不同的用途,需要根据上下文区分:


一、TRUNCATE TABLE —— 清空表数据

语法

sql

TRUNCATE TABLE 表名;

作用

  • 删除表中的所有数据,但保留表结构(字段、索引、约束等)

  • 相当于执行了DELETE FROM 表名(不带 WHERE),但速度更快

特点对比

特性TRUNCATEDELETE
删除所有数据✅(不带 WHERE)
保留表结构
执行速度极快较慢(逐行删除)
重置自增 ID✅ 重置为初始值❌ 不重置
可回滚(事务中)❌ 不可回滚(DDL 操作)✅ 可回滚
触发行级触发器❌ 不触发✅ 触发
释放磁盘空间✅ 释放❌ 不释放(需要 OPTIMIZE)
锁定方式表级锁行级锁

使用示例

sql

-- 清空 user 表的所有数据 TRUNCATE TABLE user; -- 只保留表结构,所有数据被删除,自增 ID 从 1 重新开始 INSERT INTO user (name) VALUES ('张三'); -- id = 1

⚠️ 注意事项

  1. TRUNCATE 是 DDL(数据定义语言)操作,不是 DML,无法回滚(即使在事务中)

  2. 如果有外键约束指向该表,TRUNCATE可能会报错:

    sql

    -- 错误示例 TRUNCATE TABLE orders; -- 如果 orders 表有子表引用,会报错: -- Cannot truncate a table referenced in a foreign key constraint

    解决方法:先删除外键约束,或用DELETE代替

  3. 无法带 WHERE 条件,必须全表清空

  4. 执行后,自增主键计数器会重置


二、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()函数,用来截断数字小数位或日期精度