데이터가 많을 수는 있지만, 다 쓸모 있는 건 아니잖아. 테이블이 쓰레기장이 되지 않게 PostgreSQL에서는 제약조건을 걸 수 있어. 이건 마치 간단한 규칙처럼, 누가 "이름" 필드에 숫자를 넣거나 비워두지 못하게 막아주는 거지.
constraints가 뭐야?
제약조건(constraints)은 PostgreSQL에서 군대 규칙 같은 거야. 이게 없으면 아무나 아무거나 할 수 있지: 사용자 나이를 -999로 넣거나, 이름 대신 빈 문자열을 넣거나, 같은 학생을 다른 id로 두 번 넣을 수도 있어. 이런 걸 막으려고 PostgreSQL은 제약조건이라는 컨트롤 메커니즘을 제공해.
제약조건을 쓰면 이런 게 가능해:
- 데이터가 유효하고 일관성 있게 유지돼.
- 데이터가 특정 규칙을 따르는지 확인할 수 있어 (예: 나이가 음수면 안 됨).
- 데이터가 기대와 다르면 에러 찾기가 쉬워져.
오늘은 제일 많이 쓰는 두 가지 제약조건, NOT NULL이랑 UNIQUE를 볼 거야.
NOT NULL 제약조건
NOT NULL 제약조건은 PostgreSQL한테 "야, 이 필드는 무조건 값이 있어야 해. 비워두면 안 돼!"라고 말하는 거야. 만약 NULL이 들어간 행을 추가하려고 하면 PostgreSQL이 에러를 뱉어. 특히 이름이나 생년월일처럼 꼭 필요한 필드에 유용하지.
NOT NULL 사용 예제
CREATE TABLE teachers (
id SERIAL PRIMARY KEY, -- 고유 식별자
name VARCHAR(100) NOT NULL, -- 선생님 이름 (필수)
subject VARCHAR(50) NOT NULL -- 담당 과목 (필수)
);
여기서 name이랑 subject 컬럼은 비워둘 수 없어. 만약 이 컬럼에 값을 안 넣고 행을 추가하려고 하면 에러가 나와.
INSERT INTO teachers (name, subject)
VALUES (NULL, 'Mathematics');
결과: 에러! 선생님 이름을 안 넣었는데, name은 값이 꼭 필요하거든.
UNIQUE 제약조건: 유일성 보장
UNIQUE 제약조건은 컬럼이나 컬럼 조합에 중복된 값이 들어가는 걸 막아줘. 예를 들어, 두 학생이 같은 학번을 갖지 않게 하고 싶을 때 쓰면 좋아.
NOT NULL이 "모든 손님은 옷을 입어야 해"라면, UNIQUE는 "파티에 같은 옷 입고 오면 안 돼" 같은 느낌이지.
UNIQUE 사용 예제
CREATE TABLE departments (
id SERIAL PRIMARY KEY, -- 고유 식별자
name VARCHAR(100) UNIQUE -- 부서 이름은 유일해야 함
);
이제 같은 이름의 부서를 두 번 추가할 수 없어.
INSERT INTO departments (name) VALUES ('Mathematics');
INSERT INTO departments (name) VALUES ('Mathematics');
결과: 에러! name 컬럼에 중복된 값을 넣으려고 했어.
조합 UNIQUE 제약조건
두 개(이상) 컬럼 조합에 대해서도 유일성을 줄 수 있어. 예를 들면:
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY, -- 행 고유 식별자
student_id INTEGER NOT NULL, -- 학생 식별자
course_id INTEGER NOT NULL, -- 강좌 식별자
UNIQUE (student_id, course_id) -- 한 학생이 같은 강좌에 두 번 등록 못 함
);
이제 student_id와 course_id의 조합이 유일해야 해. 누가 같은 학생을 같은 강좌에 두 번 등록하려고 하면 PostgreSQL이 막아줄 거야.
제약조건 조합: NOT NULL과 UNIQUE
한 컬럼에 NOT NULL이랑 UNIQUE를 같이 쓸 수도 있어. 예를 들어:
CREATE TABLE users (
username VARCHAR(50) NOT NULL UNIQUE, -- 유일하고 필수인 로그인
email VARCHAR(100) NOT NULL UNIQUE -- 유일하고 필수인 이메일 주소
);
여기서는 로그인과 이메일 주소가 유일해야 하고, 비워둘 수도 없어.
제약조건 쓸 때 흔한 실수
UNIQUE만 걸고 NOT NULL을 안 쓰면, NULL 값을 여러 번 넣을 수 있어. PostgreSQL은 NULL이 다른 NULL과 같지 않다고 생각하거든. 빈 값도 막고 싶으면 NOT NULL도 같이 써야 해.
UNIQUE 제약이 걸린 컬럼에 중복 값을 넣으려고 하면 에러가 나와. INSERT 하기 전에 항상 입력값을 체크하자.
제약조건을 너무 많이 쓰면 insert 성능이 떨어질 수도 있어.
이게 왜 필요할까?
제약조건을 쓰면 데이터 중복, 빈 값, 그리고 사람 실수로 생기는 여러 문제를 막을 수 있어. 데이터베이스가 "셀프 방어"를 하게 되는 거지. 대규모 프로젝트에서는 이게 진짜 시간 절약이 돼. 면접에서도 제약조건에 대해 자주 물어보니까 NOT NULL이랑 UNIQUE를 아는 건 실무에도, 취업에도 다 도움 돼.
다음 강의에서는 DEFAULT 제약조건을 다룰 거야. 이건 사용자가 값을 안 넣었을 때 기본값을 지정해주는 거야. 다음에 또 보자!
GO TO FULL VERSION