Postgresql和PHP:在多用户应用程序中,currval是一种检索最后一行插入id的有效方法吗?

我想知道我用来检索 postgresql表中插入的最后一行的id的方式是有效的..

显然,它可以工作,但是当我有许多用户同时在同一个表中添加行时,引用串行序列currval值可能会有问题.

我的实际方式是:

$pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant connect');

$insert = pg_query("INSERT INTO customer (name) VALUES ('blabla')");
$last_id_query = pg_query("SELECT currval('customer_id_seq')");
$last_id_results = pg_fetch_assoc($last_id_query);
print_r($last_id_results);
pg_close($pgConnection);

好吧,它只是一个测试atm.
但无论如何,我可以用这种方式看到3个问题:

>引用customer_id_seq,如果两个用户在同一时间做同样的事情,可能会发生他们从那个方式得到相同的id ……或不?
>我必须知道表的序列名称.知道pg_get_serial_sequence不适用于我(在postgresql上我是新手,可能是配置问题)

有什么建议/更好的方法吗?

p.s:我不能使用PDO,因为似乎缺少事务保存点;我不会使用zend,最后,我更喜欢使用php pg_ *函数(也许我最终会构建我的类)

编辑:

@SpliFF(他们删除了他的回答):这会更好吗?

$pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant connect');

pg_query("BEGIN");

$insert = pg_query("INSERT INTO customer (name) VALUES ('blabla')");

$last_id_query = pg_query("SELECT currval('customer_id_seq')");

$last_id_results = pg_fetch_assoc($last_id_query);

print_r($last_id_results);

//do somethings with the new customer id

pg_query("COMMIT");

pg_close($pgConnection);

解决方法

如果您使用较新版本的PostgreSQL(> 8.1),则应使用INSERT(和UPDATE)命令的RETURNING子句.

OTOH如果你坚持使用其中一个序列操作函数,请阅读fine manual.一个指针:“请注意,因为这会返回一个会话本地值,它给出了一个可预测的答案,无论其他会话是否已执行nextval会议确实.“

相关文章

文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,...
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb...
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才...
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation...
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgr...
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解...