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

Top*_*gio 3 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...
Run Code Online (Sandbox Code Playgroud)

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

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

PS我想念Ruby on Rails!

alv*_*rre 5

可能你最好的选择是使用INSERT INTO questions ... VALUES (1,1,1) RETURNING audit_id,因为无论你手动插入值还是通过序列插入值,这都会给你正确的价值.

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

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