我想知道我用来检索插入到 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);
嗯,这只是一个测试自动取款机。
但无论如何,我可以通过这种方式看到 3 个问题:
- 引用 customer_id_seq,如果两个用户同时做同样的事情,可能会发生他们都从这种方式获得相同的 id...或者不是?
- I 必须知道表的序列名称。因为 pg_get_serial_sequence 不适合我(我是 postgresql 的新手,可能是配置问题)
有什么建议/更好的方法吗?
p.s:我无法使用 PDO,因为事务保存点似乎有点缺乏;我不会使用 zend,最后,我更喜欢使用 php pg_* 函数(也许我最终会构建我的类)
EDIT:
@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 如果您坚持使用序列操作函数之一,请阅读精美手册 http://www.postgresql.org/docs/current/static/functions-sequence.html。一个指针:“请注意,因为这是返回一个会话本地值,所以它会给出一个可预测的答案,无论其他会话自当前会话以来是否执行过 nextval。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)