2013-10-25 41 views
2

我有2個表,TableA和TableB。 TableB有一個指向TableA的fk字段。pg_prepare:不能將多個命令插入預準備語句中

我需要爲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個獨立的語句。我試圖用沒有開始提交併得到相同的錯誤。

任何想法如何做到這一點?

+1

看來你很混淆語句和交易。在一個事務中,您可以根據需要執行儘可能多的語句。事實上,這是首先進行交易的要點。 –

+0

By聲明我的意思是一個由1 pg_prepare()準備的SQL語句,由1 pg_execute()來執行。在這種情況下,該語句有2個要執行的命令,並且它們必須是事務性的。 – Hikari

+0

是的。這對於pg_prepare是不可能的。 –

回答

1

爲了理解正在發生的事情和您的選擇,讓我解釋一下準備好的聲明是什麼以及不是什麼。您可以使用pg_prepare,但僅適用於個別聲明,不適用於整個事務。

準備好的語句是交給PostgreSQL的語句,然後解析並存儲爲解析樹以供將來使用。在第一次執行時,解析樹會根據提供的輸入進行規劃並執行,並將計劃緩存以供將來使用。通常,使用預準備語句是沒有意義的,除非您想重用查詢計劃(即執行大量相同的更新語句,大致執行相同數量的行),所有操作都在同一個事務中。

如果您希望獲得從分析樹中分離參數但不緩存計劃的好處,請參閱PHP文檔中的pg_query_param()。這可能是你想要的。

+0

「當事務提交或回滾時,額外準備的語句過期」您確定這一點嗎?我認爲這是當連接關閉:同一連接上的多個事務應該能夠重用準備好的語句... – Kek

+0

@Kek是的,你是對的。他沒有閱讀文件,而是給出意見而不是事實作爲答案。這是一個不好的答案。 –