pg_prepare:无法将多个命令插入到预准备语句中

时间:2013-10-25 12:25:38

标签: php postgresql transactions prepared-statement

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

我需要对TableA使用DELETE语句,当删除其中的记录时,我需要删除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个单独的语句。我试着在没有begin-commit的情况下使用并得到同样的错误。

知道该怎么做吗?

1 个答案:

答案 0 :(得分:1)

为了理解发生了什么以及你的选择,让我解释一下准备好的陈述是什么以及它不是什么。您可以使用pg_prepare,但仅用于单独的语句,而不是整个事务。

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

如果您想要的东西可以让您从分析树中分离参数但不会缓存计划,请参阅PHP文档中的pg_query_param()。这可能就是你想要的。