获取Postgresql的最后插入ID

6

根据问题所述:

PHP Postgres:获取最后插入的ID

他们表示检索最后插入的ID的最佳方法是:

INSERT INTO ....
RETURNING id;

我希望创建一个Postgresql的包装类,这样当我运行以下代码时:
```python ```
$id = $db_wrapper->insert("INSERT...");

它将始终返回插入到变量$id中的最后一个ID。我不知道要传递给insert()函数的查询的auto_inc列名,而且我宁愿不必在所有插入查询的末尾添加"RETURNING id" - 有什么好主意吗?


3
在插入操作后立即执行 "select lastval()"。 - user330315
一张表可以使用多个序列,如果你不知道列名,你想要哪一个? - Frank Heikens
请注意,lastval()在我使用的Postgres 8和PHP 7 PDO中返回错误。使用 returning id 就可以了。请参考接受的解决方案 - WEBjuju
3个回答

13

使用RETURNING的INSERT操作

INSERT INTO employee (lastname,firstname) VALUES ('Jain', 'Manish') RETURNING id;

我更喜欢使用 LASTVAL(); 函数获取服务器上同时出现数千个请求时的最后一个 curval 值。虽然它说这两个函数都是并发的,并且与各自的会话一起工作,但我认为

RETURNING id

更好、更安全。

优点:这是获取最后插入的 ID 最基本和现实的方法,直到一次性直接输入 1050 条数据时仍未出现问题。;) 有点负载测试。

缺点:几乎没有,你可能需要修改调用 INSERT 语句的方式(在最坏的情况下,也许你的 API 或 DB 层不希望 INSERT 返回一个值);它不是标准 SQL(谁关心呢)。


1
有些棘手但很美妙,使用PostgreSQL 8和PHP 7与PDO连接一起工作。就在 $sth->execute(); 执行完后,我用 $row = $sth->fetch(\PDO::FETCH_ASSOC); 捕获了结果,就像是一个 SELECT 语句一样简单明了。非常好用,非常简洁。 - WEBjuju
RETURNING语句在8.2版本中引入;它在8.1版本中不存在。 - MM.

6

默认情况下,PostgreSQL会创建一个名为'user_id_seq'的序列。例如,如果您的表名是user,那么它就是user_id_seq

然后您可以执行以下操作:

$strTable = "user";
$last_insert_id = $objPDO->lastInsertId("{$strTable}_id_seq");

请参见针对多用户安全的方法:http://www.postgresql.org/docs/9.0/interactive/functions-sequence.html 另请参见其他方式:postgresql的mysql_insert_id替代方案 编辑:根据的评论。
//if your table name in model is **user**
$strTable = "user";
$model = new User(); 

// do your stuff
$model->save();

$last_insert_id = $model->lastInsertId("{$strTable}_id_seq");

或者

如果你的模型叫做 Model,并且有一个叫做 id 的属性(也就是表的主键),那么你可以这样访问:

//...
$model = new Model();
// do your stuff....
$model->save();

$the_id = $model->id;

只有在要求创建序列时,PostgreSQL 才会创建序列:使用 CREATE SEQUENCE 或 SERIAL 数据类型。 - Frank Heikens

-4
$po_curr_id = PurchaseOrder::select('purchase_orders')->max('id');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接