에듀테크 프로젝트 대시보드
제약 조건
데이터 무결성은 애플리케이션이 아니라 데이터베이스가 지키게 하세요. 버그가 있어도 DB 가 막아줍니다.
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) -- 복합 유니크
);| 옵션 | 부모 행 삭제 시 |
|---|---|
NO ACTION (기본) | 자식이 있으면 에러 (체크를 statement 끝으로 미룸) |
RESTRICT | 자식이 있으면 즉시 에러 |
CASCADE | 자식 행도 함께 삭제 |
SET NULL / SET DEFAULT | 자식의 FK 컬럼을 NULL / 기본값으로 |
CASCADE 는 편하지만 대량 삭제가 연쇄되면 위험 — 로그·감사 테이블엔 보통 RESTRICT-- 기본: NULL 은 서로 '다르다' 취급 → 여러 행이 NULL 가능
-- PG15+ : NULL 도 중복 불가로
CREATE TABLE t (code text UNIQUE NULLS NOT DISTINCT);부분 유니크 인덱스로 '삭제 안 된 행만 유니크' 같은 규칙도 가능: CREATE UNIQUE INDEX ON users (email) WHERE deleted_at IS NULL;
-- 큰 테이블에 락을 짧게: 먼저 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; -- 여기서만 가벼운 락