代码之家  ›  专栏  ›  技术社区  ›  Topher Fangio

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

  •  3
  • Topher Fangio  · 技术社区  · 16 年前

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

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

    看起来像这样:

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

    我见过 mysql_insert_id() mysql的函数,听说了 pg_last_oid() 与PostgreSQL相似,但是 documentation 声明它已被弃用,将很快删除。我也看到了 CURRVAL('my_sequence_table.id') 但我不确定这是否适用于Ajax,因为这可能会增加竞争条件。

    有人能告诉我 标准 php/postgresql解决这个问题的方法?我非常感谢任何评论。

    另外,我想念Ruby on Rails!

    3 回复  |  直到 16 年前
        1
  •  2
  •   mst    16 年前

    mysql有autoincrement字段的概念,postgresql有autoincrement字段的概念。 序列 . Postgres序列是一个命名的数据库对象,其值可以增加。请看这个 FAQ .

        2
  •  5
  •   alvherre    16 年前

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

    注意, currval() 如果你得到同样的训练,技巧当然会起作用。-- 当前() 保证返回与传递给会话的序列相同的值,而不管其他并发会话在做什么。只有当您的连接池在第一个查询中使用了与第二个查询不同的连接时,它才可能导致问题,但是如果它这样做了,那么它将彻底崩溃。我知道没有人会用这种方式做事。

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

        3
  •  0
  •   davidsheldon    16 年前

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

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