【问题标题】:Postgres/PHP - What is the standard way to retrieve the ID of an inserted row?Postgres/PHP - 检索插入行 ID 的标准方法是什么?
【发布时间】:2011-01-01 07:55:29
【问题描述】:

我在 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 方法?我将不胜感激任何 cmets。

附:我想念 Ruby on Rails!

【问题讨论】:

  • 哦顺便说一句,pg_last_oid 肯定不是一个好主意。默认情况下,表不再具有 OID。
  • @alvherre - 是的,我在阅读的某个地方发现了这一点。 OID 中的 O 到底代表什么?
  • “对象”。请注意,OID 仍用于标识系统对象(即表、模式、数据库等)。
  • @alvherre - 谢谢。很有趣。

标签: php database postgresql


【解决方案1】:

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

请注意,如果您获得相同的会话,currval() 技巧肯定会起作用——currval() 保证返回与传递给您会话的序列相同的值,而不管其他并发会话正在做什么。如果您的连接池以某种方式在第一个查询与第二个查询中使用不同的连接,则它只会导致问题,但如果这样做,它将完全破坏池。据我所知,没有哪个台球玩家会这样做。

更新:参见 pg_get_serial_sequence() 函数,该函数接受表和列名并返回关联的序列名。它比在代码中硬编码序列名称更实用。

【讨论】:

  • 感谢您对RETURNINGcurrval() 的意见。很高兴看到其他人采取什么方式。
【解决方案2】:

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

【讨论】:

  • 感谢您的链接。在阅读了更多内容后,我想我会使用RETURNING id 选项。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2010-10-20
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多