You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL执行DELETE语句时会插入什么内容?

PostgreSQL MVCC中DELETE操作实际插入的内容

首先要纠正一个常见误解:PostgreSQL的DELETE操作不会在目标表中插入新的用户可见行记录,你之前提到的“插入新记录”大概率是混淆了WAL(Write-Ahead Log)中的操作日志,或是触发器/逻辑复制场景下的附加行为。

PostgreSQL的DELETE是典型的逻辑删除,核心操作围绕旧行版本的标记展开:

  • 定位到要删除的目标行版本,将其xmax字段设置为当前执行DELETE的事务ID(xid),同时更新行头的t_infomask掩码位(比如事务提交后会标记HEAP_XMAX_COMMITTED),以此标识该版本行已被当前事务逻辑删除,后续事务无法再看到这个行版本(除非是能读取未提交数据的特殊隔离级别)。
  • 只有当表上存在AFTER DELETE触发器,或是开启了逻辑复制(需要同步删除事件到订阅端)时,才会生成额外的记录:比如触发器可能插入自定义日志行,逻辑复制会在WAL中写入专门的删除事件条目,但这些都不属于DELETE针对目标行插入的内容,而是附加的业务或复制需求产物。

对比Cassandra的墓碑机制:两者确实有相似性——都是先标记旧数据无效,而非立即物理删除,后续由后台进程(PostgreSQL的VACUUM、Cassandra的压缩进程)清理无效数据。但PostgreSQL没有像Cassandra那样在数据文件中插入独立的墓碑条目,而是直接复用旧行的元数据字段完成标记。

内容的提问来源于stack exchange,提问作者Jim Wartnick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:05:26