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:
我认为BEGIN
和START 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;
但是不要忘记以后COMMIT
或ROLLBACK
终止开放交易。
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;