2016-07-30 3 views
1

containerを表す多対多の関係がitemを保持しています。return句は常に最初に実行されますか?

私はテーブルに主キーrow_idを持っています。

私は4つの行:(container_id, item_id) values (1778712425160346751, 4)を挿入します。これらの行は、前述の一意の行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句が実行されることはいつも期待できますか?これは特定のバージョンまたは特定のソフトウェアの特異性ですか?

答えて

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)  
+0

私は、更新を行う場合には、戻り値が更新**後**値であると思われることを指摘したいと思います。 ... – tenCupMaximum

+1

削除された列や更新された列の値は、常に最新の値になります。ここでは、 'returning'節の**サブクエリ**について説明しています。 – klin

+0

ああ、もし私が 'returned selectedColumn from table'を返すと、古い値を取得します。もし' returnedColumn'を返すと、更新された値を取得します。それは賢明な結果です。 – tenCupMaximum

関連する問題