
前几篇帖子介绍了 GaussDB 数据库中常用数据类型(如 Numeric 与 Float)以及逻辑、比较、数字操作符的使用。在日常数据管理中,我们经常需要清空表中的数据,GaussDB 主要提供两种方式:DELETE和TRUNCATE。虽然目标相似,但它们在实现机制、性能、事务控制等方面有本质区别。以下是详细对比:
一、基本定义
命令 | 类型 | 作用 |
DELETE | DML(数据操作语言) | 逐行删除表中数据(可带条件) |
TRUNCATE | DDL(数据定义语言) | 快速清空整张表(不可带条件) |
区别:
二、核心区别
1.执行方式与性能
2.事务与回滚
3.条件支持
4.自增列(Serial/Identity)重置
5. 权限要求
三、使用建议
场景 | 推荐命令 | 原因 |
快速清空整张大表(如日志表、临时表) | TRUNCATE | 速度快,重置自增ID |
删除部分数据(如过期记录) | DELETE | 支持条件筛选 |
需要回滚清空操作 | DELETE | TRUNCATE 无法回滚 |
表上有外键引用 | DELETE | TRUNCATE 可能被外键约束阻止(需先处理依赖) |
四、示例
-- 快速清空整张订单表(重置自增ID)
TRUNCATE TABLE orders;
-- 删除2023年之前的订单(保留历史数据)
DELETE FROM orders
WHERE order_date < '2023-01-01';
-- 尝试回滚 DELETE(成功)
BEGIN;
DELETE FROM temp_table;
ROLLBACK; -- 数据恢复
-- 尝试回滚 TRUNCATE(失败!)
BEGIN;
TRUNCATE TABLE temp_table;
ROLLBACK; -- 数据已丢失!
五、总结
特性 | DELETE | TRUNCATE |
类型 | DML | DDL |
速度 | 慢(逐行) | 快(释放数据页) |
可回滚 | 是 | 否(自动提交) |
支持 WHERE | 是 | 否 |
重置自增ID | 否 | 是 |
触发器 | 触发 | 不触发 |
适用场景 | 精准删除、需回滚 | 快速清空整表 |
口诀:“删部分用DELETE,清整表用TRUNCATE;要回滚选 DELETE,求速度选 TRUNCATE!”
以上内容均为本人学习 GaussDB 过程中,针对实操遇到的问题、学习产生的疑惑所做的个人总结与经验梳理,初衷是希望能为同路学习者提供一点参考和帮助。内容仅作交流学习之用,若有疏漏或不当之处,欢迎大家指正交流。
本文由le就这样吧原创发布于社区,未经作者许可,禁止转载。





