CodeGym /행동 /SQL SELF /PostgreSQL에서 임시 테이블 다루기

PostgreSQL에서 임시 테이블 다루기

SQL SELF
레벨 18 , 레슨 3
사용 가능

PostgreSQL에서 임시 테이블 다루기

임시 테이블은 지금 네가 쓰고 있는 세션이나 트랜잭션 안에서만 존재하는 테이블이야. 세션이 끝나거나(혹은 트랜잭션이 닫히면) 임시 테이블과 그 안의 데이터는 모래 위의 발자국처럼 사라져. 임시 데이터 저장, 중간 계산, 복잡한 작업을 위한 데이터 준비에 딱이야.

왜 필요할까?

  • 임시 데이터 저장: 예를 들어, 여러 단계로 복잡한 계산을 해야 할 때가 있잖아. 메인 테이블을 괜히 무겁게 하지 말고 임시 테이블을 쓰면 돼.
  • 데이터 분석: 여러 소스에서 데이터 모아서 가공하고, 분석 끝나면 임시 테이블은 삭제하면 끝.
  • 복잡한 쿼리 최적화: 가끔은 쿼리를 여러 단계로 쪼개서 임시 테이블을 쓰는 게 훨씬 빨라.
  • 리스크 최소화: 진짜 테이블을 실수로 망칠 걱정 없어 — 임시 테이블은 완전히 격리되어 있어.

임시 테이블의 마법은, 그 데이터가 오직 너한테만 보인다는 거야! 다른 DB 유저들은 절대 못 봐서, 실험하기에도 완전 안전해.

임시 테이블 만들기

임시 테이블 만드는 건 일반 테이블이랑 거의 똑같은데, TEMPTEMPORARY 키워드만 추가하면 돼.

문법:

CREATE TEMP TABLE table_name (
    column_name data_type constraints,
    ...
);

진짜 쉽지? 임시 테이블은 네 세션이 끝나면 자동으로 사라져.

예시로 학생 데이터 저장용 임시 테이블을 만들어보자:

CREATE TEMP TABLE temp_students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age > 0)
);

이제 temp_students라는 임시 테이블이 생겼고, 여기에 데이터 넣고 일반 테이블처럼 쓸 수 있어. 단, 세션 닫으면 바로 사라진다는 거 잊지 마!

쿼리 결과로 임시 테이블 만들기

가끔은 임시 테이블 구조를 일일이 적기 귀찮을 때가 있지 — 그냥 쿼리 결과만 저장해서 쓰고 싶을 때! 이럴 땐 이렇게 하면 돼:

CREATE TEMP TABLE 테이블_이름 AS
SELECT ...;

이 방식은 임시 테이블을 만들면서 바로 쿼리 결과로 데이터도 채워줘.

예를 들어, 아직 아무 과목에도 등록 안 한 학생들만 저장하고 싶다고 해보자:

CREATE TEMP TABLE temp_unregistered_students AS
    SELECT s.id, s.name
    FROM students s
    LEFT JOIN enrollments e ON s.id = e.student_id
    WHERE e.student_id IS NULL;

이제 temp_unregistered_students 테이블이 생겼고, 스크립트 다른 부분에서 이걸 쓸 수 있어 — 쿼리 반복할 필요 없이!

왜 이렇게 쓰지?

  • 컬럼이랑 타입을 굳이 안 적어도 돼 — PostgreSQL이 SELECT 결과로 알아서 정해줘.
  • 임시 데이터 여러 번 쓸 수 있고, 다시 계산할 필요 없어.
  • 리포트, ETL 작업, 분석할 때 특히 유용해.

트랜잭션 안에서 임시 테이블

임시 테이블은 트랜잭션 안에서도 만들 수 있어. 이 경우 트랜잭션 끝나면 자동으로 삭제돼. 임시 데이터가 DB에 남지 않게 확실히 하고 싶을 때 특히 좋아. 트랜잭션에 대해서는 나중에 더 자세히 다룰 거니까, 지금은 그냥 편하게 써봐 :P

예시:

BEGIN;

CREATE TEMP TABLE temp_transactions (
    transaction_id SERIAL PRIMARY KEY,
    amount NUMERIC(10, 2) NOT NULL,
    status VARCHAR(50)
);

INSERT INTO temp_transactions (amount, status)
VALUES (100.50, '대기중');

-- 데이터 한번 볼까
SELECT * FROM temp_transactions;

COMMIT;
-- 이제 temp_transactions 테이블은 사라졌어!

COMMIT 대신 ROLLBACK을 하면 데이터랑 테이블도 같이 삭제돼.

실전에서 임시 테이블 쓰기

예시 1: 임시로 데이터 합치기

예를 들어, studentscourses 두 테이블이 있다고 해보자. 아직 과목에 등록 안 한 학생이 누군지 알아내야 해. 먼저 임시 테이블에 데이터 모으고, 그 다음 분석하면 돼.

CREATE TEMP TABLE temp_unregistered_students AS
	SELECT s.id, s.name
	FROM students s
	LEFT JOIN enrollments e ON s.id = e.student_id
	WHERE e.student_id IS NULL;

-- 이제 temp_unregistered_students 임시 테이블로 작업할 수 있어.
SELECT * FROM temp_unregistered_students;

예시 2: 리포트용 데이터 준비

여러 테이블에서 데이터 모아서 가공하고, 리포트용으로 준비해야 할 때가 있지. 임시 테이블이 이런 데 딱이야.

CREATE TEMP TABLE temp_sales AS
	SELECT p.product_id, p.name, SUM(s.quantity) AS total_quantity
	FROM products p
	JOIN sales s ON p.product_id = s.product_id
	GROUP BY p.product_id, p.name;

-- 결과로 임시 테이블 만들었어. 이제 이걸로 리포트 뽑자:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;

임시 테이블의 꿀팁과 특징

임시 테이블 이름짓기: 이미 students라는 일반 테이블이 있어도, 똑같은 이름으로 임시 테이블 만들 수 있어! 세션 안에서는 임시 테이블이 우선이야. 근데 이거 까먹으면 헷갈릴 수 있으니 조심!

임시 테이블 최적화: PostgreSQL은 PRIMARY KEYUNIQUE 제약이 있는 컬럼에 자동으로 인덱스를 만들어줘. 더 빠르게 쓰고 싶으면 직접 인덱스 추가해도 돼:

CREATE INDEX idx_temp_students_age ON temp_students (age);

임시 테이블 삭제: 세션 끝나기 전에 임시 테이블을 지우고 싶으면 DROP TABLE 명령어 써:

DROP TABLE temp_students;

임시 테이블 데이터 용량: 임시 테이블은 메모리에 저장돼(리소스가 충분하면), 그래서 훨씬 빨라. 근데 데이터가 너무 많으면 디스크를 쓰기 시작할 수도 있으니 주의!

자주 하는 실수와 예방법

실수 1: "테이블이 이미 존재합니다"

이미 같은 이름의 임시 테이블이 있는데 또 만들려고 하면 에러 나. CREATE TEMP TABLE IF NOT EXISTS를 쓰거나, 만들기 전에 테이블을 지워:

DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);

실수 2: "테이블이 너무 빨리 사라짐"

트랜잭션 안에서 임시 테이블을 만들면, 트랜잭션 끝날 때 같이 사라진다는 거 잊지 마. 미리 계획 세워서 작업하자!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION