WITH之后的SELECT如果在显式事务中则不返回任何行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WITH之后的SELECT如果在显式事务中则不返回任何行相关的知识,希望对你有一定的参考价值。

WITH generated_id AS (
  INSERT INTO ... RETURNING id
)
SELECT id FROM generated_id;

返回42,而

BEGIN;
WITH generated_id AS (
  INSERT INTO ... RETURNING id
)
SELECT id FROM generated_id;
COMMIT;

没有回报。为什么?


更新:

我刚刚发现WITH是无关紧要的,因为即使是单个选择也不起作用:

SELECT something FROM some_table;

返回行。

BEGIN;
SELECT something FROM some_table;
COMMIT;

不返回任何行。


更新2:

我认为BEGINSTART TRANSACTION是完全相同的东西。无论如何,我尝试了所有可能的组合,但它们都不适合我。

我正在使用this免费postgres服务,但现在我tested it with SQL Fiddle,它不抱怨。

奇怪的是,如果我没有在SELECT行的末尾放置一个;,我的数据库引擎会给我一个语法错误,如果我把它放在那里使用SQL Fiddle,它告诉我不允许显式提交。

因此,我仍然很不清楚究竟发生了什么。它是否仅适用于SQL Fiddle,因为它实际上没有在显式事务中运行我的查询,如果它会结果是相同的:没有行,就像我的数据库引擎的行为一样。

我很遗憾无法在其他服务器上测试它,但如果有人有一个可靠的postgres配置,也许他们可以尝试它,无论它运行并告诉我。

答案

这将在大多数客户端中不返回任何内容,因为您只看到上一个命令返回的内容

BEGIN;
SELECT something FROM some_table;
COMMIT;

尝试改为:

BEGIN;
SELECT something FROM some_table;

但是不要忘记以后COMMITROLLBACK终止开放交易。

SQL Fiddle不允许显式事务包装器。 I quote:

所有SQL查询都在SQL执行后立即回滚的事务中运行。

在开放交易中发布的BEGIN;只发出一个WARNING - 它没有显示在SQL Fiddle中(你看到一个0行的结果)。

COMMIT;提出你看到的错误。

SELECT之后省略分号的尝试中,COMMIT被解释为表别名:

BEGIN;
SELECT something FROM some_table
COMMIT;

......相当于:

BEGIN;
SELECT something FROM some_table AS commit;

这是另一个误解。

另一答案

你试过说BEGIN WORK吗?我认为你需要从那开始,然后你可以用COMMIT结束它

另一答案

尝试从:

BEGIN TRANSACTION;

然后结束:

END TRANSACTION;

以上是关于WITH之后的SELECT如果在显式事务中则不返回任何行的主要内容,如果未能解决你的问题,请参考以下文章

Unity:在显式导航中使用自动导航

Prisma:在显式多对多关系中创建或连接记录

postgres 自动增量未在显式 id 插入时更新

雪花存储过程和事务:文档不清楚?

为啥在某些语言中使用变量之前需要声明变量,而在其他语言中则不需要? [关闭]

java中final的理解