如何从另一个php文件中使用PostgreSql的CURRVAL / RETURNING?

3
我正在一个PHP文件中运行一个INSERT查询,但是我需要从外部的PHP文件中获取最后插入的ID,以便基于该ID运行另一个查询。如何使用CURRVALRETURNING来完成这个操作?如果我在外部的PHP文件中执行像$result = pg_query($db,"SELECT CURRVAL('app.example_id_seq'), ... ");这样的操作,我将无法获得结果。
2个回答

6
您可以像查询表格一样查询序列:
SELECT last_value
FROM app.example_id_seq
WHERE is_called;

如果该序列从未被使用过(is_calledFALSE),则此操作将不返回任何结果。

但是,这个值不能用于确定新插入的表行的ID。仅当没有其他人在插入行后使用序列时才有效。此外,您无法确定插入是否失败。


0

不确定你的示例中的那三个点是用来做什么的。不过:

select currval('app.example_id_seq'::regclass);

应该可以工作。有时可能会失败,出现以下情况:

ERROR:  55000: currval of sequence "example_id_seq" is not yet defined in this session

currval 之前并不存在名为 nextval 的东西。但如果你调用了 insert into,那么 currval 也必须能够正常工作。

要开始使用 RETURNING,请访问 docs - 那里提供了示例。基本上,您列出应该包含在插入或更新结果中的列名称。


这是否意味着我在使用SELECT之前应该在INSERT中使用nextval?如果是,那么如果id列是自动递增的,怎么办? - Clint_A
如果您的表定义中id列的默认值为nextval,它将自行递增。因此,只需提供插入中的其他列,一切都将正常工作。 - Michał Zaborowski
如果表默认没有 nextval,会发生什么?那 RETURNING id 呢?我如何从另一个 PHP 文件中调用它? - Clint_A
currval 仅在与前面的 nextval 相同的会话中起作用。但是,看起来你所说的“来自另一个 PHP 文件”意味着“来自另一个数据库会话”或“来自另一个 HTTP 请求”,这两者本质上是相同的。Laurenz Albe 的回答适用于这种情况。 - Daniel Vérité
@DanielVérité 如果同时有两个插入操作怎么办? - Michał Zaborowski
@MichałZaborowski:由提问者自行决定是否相关获取最后插入的ID,而不知道它指向哪个条目以及在此期间是否有其他插入。从设计上看,它看起来脆弱且不适合并发使用,正如Laurenz的答案中所提到的那样。 - Daniel Vérité

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接