PostgreSQL은 제약조건(constraint) — 테이블 데이터에 대한 규칙 — 을 통해 데이터 무결성을 강제합니다. 표준 제약조건(PRIMARY KEY, , , , , ) 외에도 Postgres는 제약조건과 유연한 표현식 같은 강력한 옵션을 추가합니다.
PostgreSQL은 제약조건(constraint) — 테이블 데이터에 대한 규칙 — 을 통해 데이터 무결성을 강제합니다. 표준 제약조건(PRIMARY KEY, , , , , ) 외에도 Postgres는 제약조건과 유연한 표현식 같은 강력한 옵션을 추가합니다.
FOREIGN KEYUNIQUENOT NULLCHECKDEFAULTCHECKCREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- 고유 식별자
room_id INT NOT NULL REFERENCES rooms(id), -- 외래 키 (참조 무결성)
email VARCHAR(255) UNIQUE NOT NULL, -- 고유 + 필수
guests INT CHECK (guests > 0 AND guests <= 10), -- 값 제약
status TEXT DEFAULT 'pending' -- 기본값
);
PRIMARY KEY → 고유 행 식별자
FOREIGN KEY → 다른 테이블 참조 (참조 무결성, ON DELETE 옵션과 함께)
UNIQUE → 중복 값 없음
NOT NULL → 값이 있어야 함
CHECK → 값이 조건을 만족해야 함
DEFAULT → 제공되지 않을 때의 기본값
CHECK (price > 0)
CHECK (end_date > start_date) -- 컬럼 간 논리적 일관성
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- 정규식 검증
Postgres CHECK 제약조건은 컬럼 간 조건과 정규식 패턴을 포함한 풍부한 비즈니스 규칙을 강제할 수 있습니다.
-- 같은 방에 대한 겹치는 예약 방지 (UNIQUE만으로는 불가능!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- 시간 범위
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- room_id가 같고
); -- 시간 범위가 겹치는 두 행 없음
EXCLUDE 제약조건(Postgres 특화 기능)은 커스텀 연산자로 충돌하는 행을 방지합니다 — 유명하게는 UNIQUE 제약조건이 할 수 없는 겹치는 시간 범위(이중 예약) 방지입니다.
-- 즉시 대신 COMMIT 시 제약조건 확인 (순환 참조에 유용)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
제약조건은 데이터 무결성에 필수적입니다 — 데이터베이스 수준에서 데이터 규칙을 강제(애플리케이션 코드와 무관하게 항상 강제되는 최후의 방어선)하므로, PostgreSQL의 제약조건 지원을 이해하는 것은 견고한 데이터베이스 설계에 중요합니다.
표준 제약조건(PRIMARY KEY, 참조 무결성이 있는 FOREIGN KEY, UNIQUE, NOT NULL, CHECK, DEFAULT)과 각각이 강제하는 것을 아는 것은 스키마 설계의 기본이며, 애플리케이션 코드만으로는 할 수 없는 방식으로 버그, race condition, 일관성 없는 데이터를 막는 데이터베이스 수준 보장(고유성, 유효한 참조, 필수 값, 유효한 데이터)을 제공합니다.
PostgreSQL의 CHECK 제약조건은 특히 유능하여 컬럼 간 조건(end_date > start_date 같은 논리적 일관성)과 정규식 패턴까지 포함한 풍부한 비즈니스 규칙을 강제합니다 — 도메인 규칙을 스키마에 직접 인코딩하게 해줍니다.
특히 가치 있는 것은 Postgres 특화 EXCLUDE 제약조건으로, 커스텀 연산자로 충돌하는 행을 방지합니다 — 가장 주목할 만하게는 표준 UNIQUE 제약조건이 제공할 수 없는 겹치는 시간 범위 방지(방/리소스의 이중 예약)이며, 흔한 실제 문제(스케줄링, 예약)를 데이터베이스 수준에서 우아하게 해결하는 강력한 능력입니다.
제약조건 — 무결성을 위한 표준 제약조건, Postgres의 유연한 CHECK 표현식, 충돌 방지를 위한 강력한 EXCLUDE — 을 이해하는 것은 정확성을 자동으로 강제하는 데이터베이스 설계에 중요합니다.
데이터 무결성은 중요하고 제약조건이 애플리케이션 코드가 할 수 없는 보장을 제공하며, Postgres가 기본을 넘어선 강력한 옵션(풍부한 CHECK, 겹침을 위한 EXCLUDE)을 제공하므로, PostgreSQL의 제약조건 지원을 이해하는 것은 견고한 데이터베이스를 구축하는 가치 있고 실용적으로 관련된 지식이며, 특히 EXCLUDE 제약조건은 스케줄링/예약 시스템에 알아둘 가치가 있는 독특하고 유용한 Postgres 능력입니다.