【问题标题】:lastInsertId does not work in PostgresqllastInsertId 在 Postgresql 中不起作用
【发布时间】:2012-05-16 13:54:54
【问题描述】:

我正在使用 Postgresql,当我想使用 PDO 检索最新的插入 ID 时,我遇到了问题。这是我的代码:

$db->lastInsertId('columnName');

错误信息说

SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "columnName" does not exist

我想我对 PHP 手册中所述的“序列对象”有一些误解。

Note:

Returns the ID of the last inserted row, or the last value from a sequence object, 
depending on the underlying driver. For example, PDO_PGSQL() requires you to specify the 
name of a sequence object for the name parameter.

目前,“columnName”是该自动递增属性的字符串。谁能指出我哪里出错了?谢谢。

【问题讨论】:

标签: php postgresql pdo lastinsertid


【解决方案1】:

所以序列名称将是ingredients_id_seq

$db->lastInsertId('ingredients_id_seq');

这种格式居然解决了我的问题!!!

【讨论】:

  • 你也可以使用$db->nextval();
【解决方案2】:

PostgreSQL 使用sequencesserial 列生成值,serial 列通常用于 PostgreSQL 中的“自动递增”列。序列具有名称,并且通常独立于任何特定表,因此您可以让一个序列为多个不同的表生成唯一 ID;序列名称是 lastInsertId 想要的参数:

例如,PDO_PGSQL() 要求您为 name 参数指定序列对象的名称。

PostgreSQL创建的序列对象自动命名为[table]_[column]_seq,所以:

$id = $db->lastInsertId('tableName_columnName_seq');

【讨论】:

  • 不能那样工作。 PGSQL“需要”一个参数来指示序列对象。如果将其留空,则不会返回任何内容。
  • @Michael:那么你需要知道序列的名称。默认值为t_c_seq,其中t 是表名,c 是列名。不过,这个要求相当奇怪。我没有设置所有 PHP/PostgreSQL 的 ATM,所以我自己无法验证这些。
  • table_column_seq,就是这样!谢谢你!
  • @Michael:你也可以看看INSERT ... RETURNING id,然后完全绕过lastInsertId
【解决方案3】:

我今天遇到了这个问题,lastInsertId() 只返回 false。在另一个线程上找到了解决我问题的答案:https://stackoverflow.com/a/31638196/1477123

CREATE TABLE ingredients (
    id         SERIAL PRIMARY KEY,
    name       varchar(255) NOT NULL,
);

所以序列名称将是成分_id_seq

$db->lastInsertId('ingredients_id_seq');

【讨论】:

    【解决方案4】:

    使用序列名代替列名

    $db->lastInsertId('columnName');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-18
      • 2020-11-01
      • 1970-01-01
      相关资源
      最近更新 更多