如何从另一个 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 运行另一个查询。如何使用CURRVALRETURNING 完成此操作?从外部 php 文件中,如果我执行类似

的操作

$result = pg_query($db,"SELECT CURRVAL('app.example_id_seq'), ... ");我没有得到任何结果。

【问题讨论】:

【参考方案1】:

您可以像查询表格一样查询序列:

SELECT last_value
FROM app.example_id_seq
WHERE is_called;

如果序列从未被使用过,这将不返回任何结果(那么is_calledFALSE)。

但这对于确定新插入的表行的 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?的主要内容,如果未能解决你的问题,请参考以下文章

无法从另一个容器连接到 Postgres 容器

如何使用 OOP 将 $db 从另一个 .php 使用到另一个 .php 的类?

如何从另一个页面加载 .php 页面并加载动态内容

从另一个php文件中获取变量

PHP - 从另一个域中的外部文件调用 wordpress 函数

如何在 PHP 应用程序中从另一个站点呈现 javascript?