我想知道我用来检索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个问题:
有任何建议/更好的方法吗?
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);
答案 0 :(得分:7)
如果您使用较新版本的PostgreSQL(> 8.1),则应使用INSERT(和UPDATE)命令的RETURNING子句。
OTOH如果您坚持使用其中一个序列操作功能,请阅读fine manual。一个指针:“请注意,因为这会返回一个会话本地值,所以它给出了一个可预测的答案,无论其他会话是否已经执行了当前会话以来的nextval。”
答案 1 :(得分:1)
在一个事务中插入并检查curval(seq)。在提交交易之前,您将看到查询的curval(seq),无论是谁同时插入。
不要完全记住语法 - 请参阅手册(大约3年前最后一次使用的pgsql),但一般来说它看起来像这样:
BEGIN TRANSACTION;
INSERT ...;
SELECT curval(seq);
COMMIT;
答案 2 :(得分:-1)
离。 minsert into log(desc,user_id)values('drop her mind',6)return id