postgresql에서 insert, update, delete를 할 때 정말 insert, delete, update 등이 되었는지 알고 싶습니다. 쿼리를 실행한 결과를 가지고 오고 싶을 때 returning을 쓰는데요. 이를 통해서 불필요한 쿼리를 방지할 수 있습니다. 간단하게 예제를 보면서 알아보겠습니다.

 


 먼저, c 테이블에 필드 a의 값이 11인 레코드를 추가합니다. 추가된 레코드(Row)를 리턴하는데요. 이 레코드에서 어떤 속성을 가져올 것인지를 적어주면 됩니다.

 

 결과는 id가 11이 나왔습니다. 이는 id가 11인 Row가 추가되었다는 것을 의미합니다.

 

 이제, returning id, a를 입력해 보겠습니다. 그러면 어떻게 나올까요?

 

 

 id가 12이고 a가 11이라고 하네요? 이는 속성 id가 12이고, 속성 a가 11인 Row가 추가되었다는 것을 의미합니다. 계정을 생성한 후에, 해당 계정과 연결되는 디폴트 유저를 생성하거나 할 때 사용할 수 있겠습니다.

 


 update에서도 쓸 수 있습니다. 위 쿼리는 a의 값을 10으로 업데이트 하는데 id가 12인 Row를 업데이트 합니다. 그런데, returning이 뒤에 붙어 있습니다. 그러면 어떻게 해석하면 되나요? 변경이 되는 Row가 있을 텐데, 그 행들의 id를 얻어오라는 의미에요.

 

 12가 나오게 됩니다.

 

 id가 13인 것이 없다고 해 보겠습니다. 이 경우에는 어떨까요?

 

 그냥 비어 있네요? 어플리케이션에서는 returning을 이용해서 결과 값이 비었는지 안 비었는지 판단하면 업데이트 된 행이 있는지 없는지를 판단할 수 있습니다.

 

 delete는 어떨까요? 이것도 마찬가지입니다. id가 12인 것을 삭제합니다. returning문이 있으니까 Row를 돌려줄 겁니다. 그런데, Row의 id만 돌려준다고 합니다? 12가 있다면 12만 나올 겁니다.

 

 이제 다시 id가 12인 것을 삭제하는 sql문을 수행합니다. 그리고 returning id를 합니다. 이제는 어떻게 나올까요? 빈 값이 나와버립니다. 삭제되었다면 다른 로직을 처리하는 것이 있다고 해 봅시다. 삭제가 이루어졌는지를, 삭제 결과가 있는지 없는지로 보면 되니 이것도 어렵지 않게 할 수 있겠네요.