2016-07-30 5 views
1

container을 나타내는 many-to-many 관계가 item입니다.returning 절이 항상 먼저 실행됩니까?

테이블에 기본 키 row_id가 있습니다.

4 행 : (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 절이 삭제 전에 실행되거나 특정 버전이나 특정 소프트웨어의 고유 한 특성 일 수 있습니까?

답변

2

returning 섹션의 쿼리 사용은 허용되지만 문서화되지 않았습니다. the documentation 들어 :

output_expression

식은 계산하고, 각 행이 삭제 된 후 삭제 명령이 리턴. 표현식은 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 select updateColumn from table'을하면 오래된 값을 얻습니다.'returnedColumn'을 반환하면 업데이트 된 값을 얻습니다. 그것은 합리적인 결과입니다. – tenCupMaximum

관련 문제