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

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

概述我想知道我用来检索 postgresql表中插入的最后一行的id的方式是有效的.. 显然,它可以工作,但是当我有许多用户同时在同一个表中添加行时,引用串行序列currval值可能会有问题. 我的实际方式是: $pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant 我想知道我用来检索 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 IDpg_query("COMMIT");pg_close($pgConnection);
解决方法 如果您使用较新版本的Postgresql(> 8.1),则应使用INSERT(和UPDATE)命令的RETURNING子句.

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

总结

以上是内存溢出为你收集整理的Postgresql和PHP:在多用户应用程序中,currval是一种检索最后一行插入id的有效方法吗?全部内容,希望文章能够帮你解决Postgresql和PHP:在多用户应用程序中,currval是一种检索最后一行插入id的有效方法吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1153266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存