3

我想知道我用来检索插入到 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 个问题:

  1. 参考customer_id_seq,如果两个用户同时做同样的事情,可能会发生他们都通过这种方式获得相同的ID......或者不是?
  2. 必须知道表的序列名称。因为 pg_get_serial_sequence 对我不起作用(我是 postgresql 的新手,可能是配置问题)

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

ps:我不能使用 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);
4

3 回答 3

7

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

OTOH 如果您坚持使用其中一种序列操作功能,请阅读精美手册。一个指针:“请注意,因为这是返回一个会话本地值,所以它给出了一个可预测的答案,即自当前会话以来其他会话是否已执行 nextval。”

于 2009-05-21T10:19:56.817 回答
1

在一个事务中插入并检查 curval(seq)。在提交事务之前,您将看到查询的 curval(seq) 并且无论同时插入的其他人。

不记得确切的语法 - 阅读手册(大约 3 年前最后一次使用 pgsql),但通常它看起来像这样:

BEGIN TRANSACTION;
INSERT ...;
SELECT curval(seq);
COMMIT;
于 2009-05-21T11:42:31.487 回答
-1

前任。minsert into log (desc,user_id) values ('drop her mind',6) 返回 id

于 2010-10-13T15:38:53.430 回答