我有一个多对多关系代表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
子句在删除之前执行,或者这是某些版本或特定软件的特质?
答案 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)