PostgreSQL CTE 与 DELETE ... RETURNING 和 LIMIT 的意外行为
2025-05-04
作者在使用PostgreSQL的Common Table Expression (CTE)结合DELETE ... RETURNING和LIMIT处理队列式表中的批量项目时,发现了意外行为。预期只删除一行,但实际却删除了多行。通过EXPLAIN ANALYZE分析,发现查询计划使用了嵌套循环半连接,导致LIMIT 1被多次执行。解决方法是将CTE中的子查询直接嵌入DELETE语句的WHERE子句中,避免查询计划的优化策略导致意外行为。这提醒我们,CTE并非总是优化屏障,在关键操作中应仔细检查查询计划。
开发