truncate 和 delete 在 codeigniter 中行为与原生 sql 一致:delete 支持 where 条件、可回滚、不重置自增 id、触发触发器;truncate 不支持 where、不可回滚、重置自增 id、释放空间、绕过触发器且受外键约束限制。

在 CodeIgniter 中清空数据表,TRUNCATE 和 DELETE 的底层行为与原生 SQL 一致,但框架提供了不同封装方式。选择哪个,关键看你要不要条件删除、回滚能力、自增ID重置、触发器响应等。
是否支持 WHERE 条件
DELETE 在 CodeIgniter 中可通过 Query Builder 灵活加条件:
-
$this->db->delete('users');—— 清空整表(等效于DELETE FROM users) -
$this->db->where('status', 'inactive')->delete('users');—— 只删指定行
TRUNCATE 没有对应 Query Builder 方法,必须用原生查询:$this->db->query('TRUNCATE TABLE users');
它不接受 WHERE,只能整表清空。
执行速度与日志开销
TRUNCATE 直接释放数据页,不逐行记录,速度快、日志少,适合大批量清空(如日志表、临时缓存表)。
DELETE 会为每一行生成日志,在大表上可能明显变慢,还容易触发锁等待或事务日志膨胀。
若只是清空且无回滚需求,TRUNCATE 更高效;若需审计、调试或保留事务控制,DELETE 更稳妥。
自增 ID 和空间回收
- TRUNCATE 后,MySQL/PostgreSQL 等会重置 AUTO_INCREMENT 计数器(从 1 或定义的起始值开始)
- DELETE 不重置自增 ID,新插入记录继续递增(例如删完 id=1~1000,下条是 1001)
- TRUNCATE 会真正释放磁盘空间、重置高水位线;DELETE 通常只标记删除,空间未必立即回收(尤其 InnoDB)
事务、触发器与外键约束
- DELETE 是 DML,可放在事务中,支持
$this->db->trans_start()+rollback() - TRUNCATE 是 DDL,在多数数据库中隐式提交,无法回滚(MySQL InnoDB 例外,但 CodeIgniter 默认不开启该兼容模式)
- DELETE 会触发
BEFORE/AFTER DELETE触发器;TRUNCATE 完全绕过触发器 - 有外键引用时,TRUNCATE 常报错(如 MySQL 报 “Cannot truncate a table referenced in a foreign key constraint”),此时只能用 DELETE 或先禁用约束











