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

问题描述 投票:0回答:3
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配置,也许他们可以尝试它,无论它运行并告诉我。

sql postgresql transactions
3个回答
1
投票

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

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;

这是另一个误解。


0
投票

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


0
投票

尝试从:

BEGIN TRANSACTION;

然后结束:

END TRANSACTION;
© www.soinside.com 2019 - 2024. All rights reserved.