获取Postgresql的最后一个插入ID

时间:2015-03-13 15:18:52

标签: postgresql

根据问题:

PHP Postgres: Get Last Insert ID

他们已经声明检索最后一个插入ID的最佳方法是:

INSERT INTO ....
RETURNING id;

我想为Postgresql创建一个包装类,以便在运行时,例如:

$id = $db_wrapper->insert("INSERT...");

它将始终返回插入变量$id的最后一个id。我不知道将传递给insert()函数的查询的auto_inc列名称,我不希望在所有插入查询的末尾添加"RETURNING id" - 有关如何使用的任何想法实现这个目标?

3 个答案:

答案 0 :(得分:6)

<{> INSERT RETURNING

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

我更喜欢这个,因为服务器上一次有数千个流量可能会在上一次调整或LASTVAL();时出错 Althogh它说这两个函数是并发的并且与单个会话一起工作但我认为

  

RETURNING id

更好,更安全。

优点:这是获取最后插入ID的非常基本和现实的方法, 直到1050条目一次进入才发现问题。 ;)位负载测试。

缺点:几乎没有,您可能需要修改调用INSERT语句的方式(在最坏的情况下,可能您的API或DB层不期望INSERT返回值);它不是标准的SQL(谁在乎);

答案 1 :(得分:5)

PostgreSQL将(默认情况下)创建一个名为&#39; user_id_seq&#39;的序列。例如,如果您的表名是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

查看其他方式 mysql_insert_id alternative for postgresql

编辑:根据 Eli的评论

//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的属性(也就是表的PK),那么你可以这样访问:

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

$the_id = $model->id;

答案 2 :(得分:-1)

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