如何从另一个 php 文件中使用 PostgreSql 的 CURRVAL / RETURNING?
Posted
技术标签:
【中文标题】如何从另一个 php 文件中使用 PostgreSql 的 CURRVAL / RETURNING?【英文标题】:How can I use PostgreSql's CURRVAL / RETURNING from another php file? 【发布时间】:2018-01-15 13:53:35 【问题描述】:我正在从一个 php 文件运行INSERT
查询,但是我需要从外部 php 文件中获取最后插入的 id,以便基于该 id 运行另一个查询。如何使用CURRVAL
或RETURNING
完成此操作?从外部 php 文件中,如果我执行类似
$result = pg_query($db,"SELECT CURRVAL('app.example_id_seq'), ... ");
我没有得到任何结果。
【问题讨论】:
【参考方案1】:您可以像查询表格一样查询序列:
SELECT last_value
FROM app.example_id_seq
WHERE is_called;
如果序列从未被使用过,这将不返回任何结果(那么is_called
是FALSE
)。
但这对于确定新插入的表行的 ID 来说是一个错误的值。只有在插入行后没有其他人使用该序列时,它才会起作用。此外,您无法确定插入是否失败。
【讨论】:
【参考方案2】:不确定您示例中的树点是做什么用的。然而:
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 - 提供了示例。基本上,您列出的列名应该是插入或更新的结果。
【讨论】:
这是否意味着我应该先在INSERT
中使用nextval
,然后才能在SELECT
中使用currval
?如果是,如果id
列自动递增怎么办?
如果您的表定义在 id 列的默认值中有nextval
- 它会自行递增。因此,只需在您的插入中提供其他列,一切都会正常工作
那么如果表默认没有nextval
怎么办? RETURNING id
呢?如何从另一个 php 文件中调用它?
currval
仅在与前面的nextval
相同的会话中有效。但看起来“来自另一个 php 文件”对您来说意味着“来自另一个数据库会话”或“来自另一个 HTTP 请求”,这相当于相同。 Laurenz Albe 的回答适合这种情况。
@DanielVérité 如果同时有两个插入?以上是关于如何从另一个 php 文件中使用 PostgreSql 的 CURRVAL / RETURNING?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OOP 将 $db 从另一个 .php 使用到另一个 .php 的类?