获取Postgresql的最后一个插入ID

Joe*_*dee 3 postgresql

根据问题:

PHP Postgres:获取上次插入ID

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

INSERT INTO ....
RETURNING id;
Run Code Online (Sandbox Code Playgroud)

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

$id = $db_wrapper->insert("INSERT...");
Run Code Online (Sandbox Code Playgroud)

它将始终返回插入变量的最后一个id $id.我不知道将传递给insert()函数的查询的auto_inc列名称,我宁愿不必添加"RETURNING id"到我的所有插入查询的末尾 - 关于如何实现这一点的任何想法?

man*_*706 7

INSERTRETURNING

INSERT INTO employee (lastname,firstname) VALUES ('Jain', 'Manish') RETURNING id;
Run Code Online (Sandbox Code Playgroud)

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

返回ID

更好,更安全.

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

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


Alw*_*nny 5

PostgreSQL将(默认情况下)创建一个名为'user_id_seq'的序列.例如,如果你的表名是user.那就是 user_id_seq

然后你可以这样做:

$strTable = "user";
$last_insert_id = $objPDO->lastInsertId("$strTable_id_seq");
Run Code Online (Sandbox Code Playgroud)

有关多用户安全方法,请参阅http://www.postgresql.org/docs/9.0/interactive/functions-sequence.html

请参阅mysql_insert_id替代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");
Run Code Online (Sandbox Code Playgroud)

要么

如果你的模型被称为Model,并且有一个名为id的属性(也就是表的PK),那么你可以这样访问:

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

$the_id = $model->id;
Run Code Online (Sandbox Code Playgroud)