2011-07-22 34 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,我不知道其他的或旧的版本。