DELETE 和 TRUNCATE — 都是清除表格的工具,但工作方式不同:
细微差别:
ROLLBACK),TRUNCATE — 不支持或取决于数据库。示例:
-- 删除创建超过3年的订单 DELETE FROM orders WHERE created_at < CURRENT_DATE - INTERVAL '3 years'; -- 完全清空表(快速) TRUNCATE TABLE logs;
可以在 TRUNCATE 后恢复数据吗?
常见错误:认为可以像 DELETE 一样,通过事务回滚 TRUNCATE。但 TRUNCATE 通常不可回滚或执行 UNDO,除了一些特定的数据库(例如,在事务内的 PostgreSQL)。
示例(在大多数数据库中):
BEGIN; TRUNCATE TABLE orders; ROLLBACK; -- 在大多数数据库中不起作用,数据丢失!
故事
在生产数据库中使用 TRUNCATE 删除临时数据,而不是使用 TEST。删除行的审核触发器仅在 DELETE 上触发 — 关于丢失数据、时间和用户的信息缺失。导致事件调查受到影响。
故事
在存在外键的情况下使用 TRUNCATE 清空表。SQL 因引用完整性约束而抛出错误,脚本未完成,自动化停止。解决方案:暂时移除外键或使用 DELETE。
故事
在大表中通过 DELETE 进行大规模删除数据而不进行批处理:由于长时间的锁定,数据库"挂起",其他事务等待释放锁。结果 - 系统停机。正确的做法:如果支持,使用 DELETE LIMIT/OFFSET,或进行批处理。