我在想,我用来获取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);
目前只是一个测试。 但是,我可以看到这种方式存在三个问题:
- 引用customer_id_seq,如果两个用户在同一时间做相同的事情,可能会发生他们都从那里获得相同的id...或者不会?
- 我必须知道表序列的名称。因为pg_get_serial_sequence对我不起作用(我是postgresql上的新手,可能是配置问题)。
有什么建议/更好的方法吗?
p.s:我不能使用PDO,因为它似乎在事务保存点方面缺少了一些内容;我不想使用Zend,最后,我更喜欢使用PHP pg_*函数(也许最终我会构建我的类)
编辑:
@SpliFF(thet删除了他的回答):这样会更好吗?
$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);