5

我有 2 张桌子,TableA 和 TableB。TableB 有一个指向 TableA 的 fk 字段。

我需要对 TableA 使用 DELETE 语句,当删除其中的一条记录时,我需要删除 TableB 中与 TableA 中该记录相关的所有记录。很基本。

begin;

DELETE FROM TableB
WHERE nu_fornecedor = $1;

DELETE FROM TableA
WHERE nu_fornecedor = $1;

commit;

这个字符串被传递给 pg_prepare(),但是我得到了错误 ERROR: cannot insert multiple commands into a prepared statement

好的,但是我需要在同一个事务中运行这两个命令,我不能执行 2 个单独的语句。我尝试在没有开始提交的情况下使用 with 并得到同样的错误。

知道怎么做吗?

4

1 回答 1

1

为了了解正在发生的事情和您的选择,让我解释一下准备好的陈述是什么,什么不是。您可以使用 pg_prepare,但只能用于单独的语句,不能用于整个事务。

准备好的语句是传递给 PostgreSQL 的语句,然后被解析并存储为解析树以供将来使用。在第一次执行时,使用提供的输入来规划解析树,并执行,并缓存该计划以供将来使用。通常使用准备好的语句没有什么意义,除非你想重用查询计划(即执行一堆其他相同的更新语句,命中大致相同的行数),所有这些都在同一个事务中。

如果您想要一些能够让您从解析树中分离参数但不缓存计划的好处,请参阅 PHP 文档中的 pg_query_param()。这可能就是你想要的。

于 2013-12-03T03:17:41.447 回答