Postgres / PHP - 检索插入行ID的标准方法是什么?

时间:2010-01-04 17:10:32

标签: php database postgresql

我在Google上搜索并阅读了几篇关于不同人如何解决这个问题的文章,但我想知道 标准 解决问题的方法是什么,以及哪一个最适合我的情况。

我有一个创建新问题的AJAX页面,我需要知道如何从同一个php文件中的插入查询中检索ID,在下一行。

它看起来像这样:

$r = pg_query("INSERT INTO questions (audit_id, type_id, order) VALUES (1,1,1)");
// Fetch ID from $r here...

我已经看到了MySQL的mysql_insert_id()函数,并且听说pg_last_oid()与PostgreSQL相似,但documentation声称它已被弃用,很快就会删除。我也看到了CURRVAL('my_sequence_table.id')的使用,但我不确定这是否适用于AJAX,因为这可能会引发竞争条件。

有人可以告诉我 标准 PHP / PostgreSQL解决这个问题的方法吗?我非常感谢任何评论。

P.S。我想念Ruby on Rails!

3 个答案:

答案 0 :(得分:5)

您最好的选择是使用INSERT INTO questions ... VALUES (1,1,1) RETURNING audit_id,因为无论您是手动插入值还是通过序列插入值,都可以为您提供正确的值。

请注意,如果您获得相同的会话,currval()技巧肯定会有效 - currval()保证返回与传递给您的会话的序列相同的值,而不管其他并发会话是什么这样做。它只会导致一个问题,如果你有一个连接pooler以某种方式使用不同的连接作为第一个查询而不是第二个查询,但如果它这样做,它会破坏一个pooler。我知道没有那种做事情的傻瓜。

更新:请参阅pg_get_serial_sequence()函数,该函数采用表和列名称并返回关联的序列名称。使用比在代码中对序列名称进行硬编码更实际。

答案 1 :(得分:2)

MySQL具有自动增量字段的概念,PostgreSQL具有序列的概念。 Postgres序列是一个命名的数据库对象,其值可以增加。请参阅此FAQ

答案 2 :(得分:0)

我建议使用CURRVAL('my_sequence_table.id')选项。

它不会导致竞争条件,因为它将返回当前会话的最新值 ,这将是同一会话中的两个连续语句。