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
相关产品推荐
相关产品推荐

