返回子句总是先执行吗?

时间:2016-07-30 00:51:02

标签: postgresql

我有一个多对多关系代表container持有item s。

我在表格中有一个主键row_id。

我插入了四行:(container_id, item_id) values (1778712425160346751, 4)。除上述唯一的row_id外,这些行将是相同的。

我随后执行以下查询:

delete from contains
    where item_id = 4 and
    container_id = '1778712425160346751' and
    row_id =  
        (
            select max(row_id) from contains
            where container_id = '1778712425160346751' and
            item_id = 4
        )
    returning
        (
            select count(*) from contains
            where container_id = '1778712425160346751' and
            item_id = 4
        );

现在我希望从这个查询返回3,但我得到了4.获得4是理想的行为,但它不是预期的。

我的问题是:我是否可以始终期望returning子句在删除之前执行,或者这是某些版本或特定软件的特质?

1 个答案:

答案 0 :(得分:2)

允许在returning部分中使用查询,但未记录。对于the documentation

  

output_expression

     

删除每一行后由DELETE命令计算和返回的表达式。表达式可以使用由table_name命名的表的任何列名或USING中列出的表。写*以返回所有列。

在删除之前,查询看到表处于某个状态似乎是合乎逻辑的,因为该语句尚未完成。

create temp table test as 
select id from generate_series(1, 4) id;

delete from test
returning id, (select count(*) from test);

 id | count 
----+-------
  1 |     4
  2 |     4
  3 |     4
  4 |     4
(4 rows)

同样的问题update

create temp table test as 
select id from generate_series(1, 4) id;

update test
set id = id+ 1
returning id, (select sum(id) from test);

 id | sum 
----+-----
  2 |  10
  3 |  10
  4 |  10
  5 |  10
(4 rows)