한양과학기술고등학교

에듀테크 프로젝트 대시보드

테이블 DDL

CREATE TABLE ALTER TABLE DROP TEMP UNLOGGED

스키마를 만들고 바꾸는 문법. 운영 중 ALTER 는 어떤 락을 얼마나 잡는지가 핵심입니다.

1. CREATE 변형

CREATE TABLE IF NOT EXISTS logs (...);
CREATE TABLE archive (LIKE logs INCLUDING ALL);   -- 구조 복사(인덱스·기본값 포함)
CREATE TABLE snapshot AS SELECT * FROM logs WHERE created_at < '2025-01-01';  -- 데이터까지
CREATE TEMP TABLE scratch (...);                  -- 세션 종료 시 사라짐
CREATE UNLOGGED TABLE cache (...);                -- WAL 안 씀 → 빠르지만 크래시 시 비워짐

2. 컬럼 변경

ALTER TABLE users ADD COLUMN phone text;
ALTER TABLE users ADD COLUMN status text NOT NULL DEFAULT 'active';  -- PG11+ 즉시(테이블 재작성 X)
ALTER TABLE users ALTER COLUMN phone SET NOT NULL;
ALTER TABLE users ALTER COLUMN age TYPE bigint;   -- 호환 타입이면 빠름, 아니면 재작성
ALTER TABLE users RENAME COLUMN phone TO phone_number;
ALTER TABLE users DROP COLUMN phone_number;       -- 즉시(내부적으로 숨김 처리)

3. 운영 중 ALTER 의 락

ACCESS EXCLUSIVE 락 (읽기·쓰기 모두 대기)
  • 컬럼 타입 변경(재작성 필요 시), SET DEFAULT 아닌 volatile 기본값 추가
  • ADD COLUMN ... DEFAULT 는 PG11+ 에서 메타데이터만 → 빠름
락을 줄이는 습관
  • lock_timeout 을 걸고 시도 → 실패하면 재시도 (긴 대기 줄 방지)
  • 인덱스는 CREATE INDEX CONCURRENTLY
  • 제약은 NOT VALID → VALIDATE 2단계

4. 마이그레이션은 도구로

손으로 ALTER 를 치지 말고 Alembic 같은 마이그레이션 도구로 버전 관리하세요. FastAPI + Alembic 은 FastAPI 레퍼런스 참고.

"VACUUM 은 선택이 아니라 MVCC 가 물리는 세금이다"