2011-07-22 78 views
1

所以我想在這裏通過PHP的PDO運行一些SQL(我不認爲應該是問題)像這樣:PostgreSQL的 - CURVAL不工作,使用PHP PDO

INSERT INTO example (
    d_id, 
    s_id 
) 
    VALUES (
    currval('d_id_seq'), 
    currval('s_id_seq') 
); 

我有兩個序列,分別叫做d_id_seqs_id_sec(讓我們假裝我有一個名爲d的表和一個名爲s的表,這個序列是一個名爲ID和serial類型的列)。

現在,很明顯,我這樣做不對,因爲我得到一個錯誤關於未在此會話中使用的序列:

Object not in prerequisite state: 7 ERROR: currval of sequence "d_id_seq" is not yet defined in this session

那麼,應該如何我寫這篇文章?

+0

通常在插入中使用NEXTVAL,並使用CURVAL讀取插入的值。看文檔。 http://www.postgresql.org/docs/9.0/interactive/functions-sequence.html – leonbloy

+0

我插入* other *表中的值,而不是這個。 – Incognito

+0

然後你應該從表中自己讀取這些值(如果你有它們的密鑰),或者確保它們已經被「最近」插入到這些表中 - 即在這個會話(連接)期間。順便說一句,這完全與PHP PDO無關,正如你正確地懷疑的那樣。 – leonbloy

回答

1

錯誤意味着你沒有「使用」這個會話中的序列(postgres連接)。例如,你沒有在桌子上做任何INSERT。

也許你的代碼中有一個錯誤,並在每次查詢後重新連接到postgres?

更方便的方法是在INSERT上使用INSERT RETURNING。然後你得到IDS。

1

fine manual

currval
Return the value most recently obtained by nextval for this sequence in the current session. (An error is reported if nextval has never been called for this sequence in this session.) Because this is returning a session-local value, it gives a predictable answer whether or not other sessions have executed nextval since the current session did.

您使用currval來獲取在當前會話拉出序列最後值。通常的模式是使用序列進行INSERT,然後調用currval來確定INSERT使用的值。如果您還沒有在當前會話中調用nextval,那麼currval將不會返回。

也許你實際上是尋找select max(id) from dselect max(id) from s

INSERT INTO example (d_id, s_id) 
SELECT MAX(d.id), MAX(s.id) 
FROM d, s; 

或者,也許你需要用你的ds插入在一個存儲過程,需要同時在所有三個表中插入的照顧。

2

問題可以通過下面的命令來解決:

SELECT last_value FROM d_id_seq; 

請注意,我用的PostgreSQL 9.1.9,我不知道其他的或舊的版本。