我在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!
答案 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')
选项。
它不会导致竞争条件,因为它将返回当前会话的最新值 ,这将是同一会话中的两个连续语句。