**제약 조건(constraints)**은 값의 유효성을 자동으로 검증하기 위해 열이나 테이블에 적용되는 무결성 제한입니다. 이들은 다음을 가능하게 합니다:
주요 제약 조건의 종류:
PRIMARY KEY — 고유 식별자로, 중복 및 NULL을 금지.UNIQUE — 한 열에서의 값 중복을 금지.FOREIGN KEY — 참조 무결성, 다른 테이블과의 관계.CHECK — 임의 표현식 검증.NOT NULL — 열에서 NULL 값 금지.CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), -- 외래 키 price DECIMAL(10,2) CHECK (price > 0), created_at TIMESTAMP NOT NULL );
"유일 키(UNIQUE)가 자동으로 NULL-SAFE하며, 열에 NULL 값을 여러 개 포함할 수 없는가?"
사실, 대부분의 DBMS(예: PostgreSQL, MySQL)에서 UNIQUE 제약은 NULL 값을 여러 행에서 허용합니다. NULL은 "알 수 없음"으로 간주되기 때문입니다. 이는 종종 눈에 띄지 않는 빈 값의 중복을 초래합니다.
CREATE TABLE test ( id INT PRIMARY KEY, code VARCHAR(10) UNIQUE ); INSERT INTO test (id, code) VALUES (1, NULL), (2, NULL); -- 통과
이야기
애플리케이션이 이메일로 등록을 허용했으나, 열은 UNIQUE였으나 NOT NULL이 아니어서 NULL 이메일을 가진 사용자 10명이 생겼고, 이로 인해 외부 서비스와의 통합에 문제가 발생했습니다.
이야기
티켓 주문 시스템에서 지급 테이블에 FOREIGN KEY를 추가하는 것을 잊어서, 어떤 주문과도 연결되지 않은 결제가 생겨 사용자 환불에 문제가 발생했습니다.
이야기
할인에 대한 CHECK 제약 조건: discount > 0. 0에 대한 경계 조건이 잊혀졌습니다. 결과적으로 시스템은 0보다 큰 할인만 수용하고, 할인 없음(0)은 비즈니스 논리를 망가뜨렸습니다.