RETURNING 절은 INSERT, UPDATE, DELETE 문이 영향받은 행에 대한 데이터를 반환하게 해줍니다 — 가장 흔하게는 삽입 후 자동 생성된 ID이지만, 임의의 컬럼이나 계산된 값도 가능합니다. 별도 쿼리를 절약해주는 편리한 PostgreSQL 기능입니다.
RETURNING 절은 INSERT, UPDATE, DELETE 문이 영향받은 행에 대한 데이터를 반환하게 해줍니다 — 가장 흔하게는 삽입 후 자동 생성된 ID이지만, 임의의 컬럼이나 계산된 값도 가능합니다. 별도 쿼리를 절약해주는 편리한 PostgreSQL 기능입니다.
-- 삽입에서 자동 생성된 id를 돌려받기 (별도 SELECT 불필요)
INSERT INTO users (name, email) VALUES ('Ann', '[email protected]')
RETURNING id; -- 새 id 반환
-- 여러 컬럼 또는 전체 반환
INSERT INTO users (name) VALUES ('Bob')
RETURNING id, name, created_at; -- DB 생성 값 포함
INSERT INTO users (name) VALUES ('Carol') RETURNING *; -- 전체 행
가장 흔한 용도: 삽입 후 보통 생성된 기본 키가 필요합니다(관련 삽입에 사용하거나 클라이언트에 반환하기 위해). RETURNING id는 별도 쿼리 없이 그것을 직접 돌려줍니다.
-- 무엇이 업데이트되었는지 보기
UPDATE products SET price = price * 1.1 WHERE category = 'books'
RETURNING id, name, price; -- 업데이트 후 새 값
-- 삭제된 행 캡처 (예: 아카이빙/로깅용)
DELETE FROM sessions WHERE expired = true
RETURNING id, user_id; -- 어떤 행이 삭제되었는지
RETURNING은 UPDATE(새 값 보기)와 DELETE(제거된 것 캡처 — 아카이빙이나 확인에 유용)에서도 동작합니다.
RETURNING 없이:
INSERT ...; 그 후 id를 얻기 위한 별도 SELECT → 두 번의 왕복, 그리고 잠재적
race (SELECT가 내 행을 안정적으로 얻지 못할 수 있음).
RETURNING과 함께:
단일 문장이 영향받은 데이터를 원자적으로 반환 → 왕복 감소, race 없음.
-- RETURNING이 있는 CTE를 사용하여 같은 문장에서 삽입하고 id 사용
WITH new_user AS (
INSERT INTO users (name) VALUES ('Ann') RETURNING id
)
INSERT INTO profiles (user_id, bio)
SELECT id, 'Hello' FROM new_user; -- 반환된 id를 직접 사용
RETURNING 절은 데이터를 수정할 때 효율성과 정확성에 가치 있는, 편리하고 자주 사용되는 PostgreSQL 기능입니다.
가장 흔하고 중요한 용도는 INSERT에서 자동 생성된 ID를 돌려받는 것입니다 — 거의 보편적인 필요(삽입 후 거의 항상 새 기본 키를 원함, 관련 작업에 사용하거나 애플리케이션에 반환하기 위해)이며, RETURNING id는 단일 문장에서 그것을 직접 제공합니다.
RETURNING 없이는 생성된 ID를 얻기 위해 별도 SELECT가 필요하며, 이는 추가 왕복과 잠재적 race condition(동시 시나리오에서 별도 SELECT가 특정 행을 안정적으로 가져오지 못할 수 있음)을 의미하므로, RETURNING은 더 효율적이고 더 정확합니다.
삽입 외에도 RETURNING은 UPDATE(업데이트 후 새 값 보기)와 DELETE(제거된 것 캡처 — 아카이빙, 로깅, 삭제 확인에 유용)에서 동작합니다.
CTE와 결합하면 단일 문장에서 반환된 ID를 사용하여 관련 테이블에 삽입하는 강력한 패턴을 가능하게 합니다.
데이터 수정 후 생성된 값(특히 ID)을 얻는 것은 끊임없는 필요이고, RETURNING이 이를 효율적이고 원자적으로 제공(추가 쿼리와 race condition 회피)하므로, RETURNING 절을 이해하는 것은 데이터 수정 코드를 더 깔끔하고 효율적이며 정확하게 만드는 가치 있고 자주 적용되는 PostgreSQL 지식이며 — Postgres로 작업하는 실제 애플리케이션에서 일상적으로 사용되는 실용적 편의이고, 특히 삽입 후 생성된 ID를 가져오는 보편적 필요에 그렇습니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기