한양과학기술고등학교

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

제약 조건

PRIMARY KEY FOREIGN KEY UNIQUE CHECK ON DELETE

데이터 무결성은 애플리케이션이 아니라 데이터베이스가 지키게 하세요. 버그가 있어도 DB 가 막아줍니다.

1. 기본

CREATE TABLE students (
    id        bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    email     text NOT NULL UNIQUE,
    grade     int  NOT NULL CHECK (grade BETWEEN 1 AND 3),
    nickname  text DEFAULT '익명',
    class_id  bigint REFERENCES classes(id) ON DELETE SET NULL,
    UNIQUE (class_id, nickname)          -- 복합 유니크
);

2. 외래 키의 ON DELETE / ON UPDATE

옵션부모 행 삭제 시
NO ACTION (기본)자식이 있으면 에러 (체크를 statement 끝으로 미룸)
RESTRICT자식이 있으면 즉시 에러
CASCADE자식 행도 함께 삭제
SET NULL / SET DEFAULT자식의 FK 컬럼을 NULL / 기본값으로
주의
  • CASCADE 는 편하지만 대량 삭제가 연쇄되면 위험 — 로그·감사 테이블엔 보통 RESTRICT

3. NULL 과 UNIQUE

-- 기본: NULL 은 서로 '다르다' 취급 → 여러 행이 NULL 가능
-- PG15+ : NULL 도 중복 불가로
CREATE TABLE t (code text UNIQUE NULLS NOT DISTINCT);

부분 유니크 인덱스로 '삭제 안 된 행만 유니크' 같은 규칙도 가능: CREATE UNIQUE INDEX ON users (email) WHERE deleted_at IS NULL;

4. 나중에 추가·검증

-- 큰 테이블에 락을 짧게: 먼저 NOT VALID 로 붙이고 나중에 검증
ALTER TABLE orders ADD CONSTRAINT fk_user
  FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT fk_user;   -- 여기서만 가벼운 락
"EXPLAIN ANALYZE 없이 성능을 논하지 마라"