제약조건이 있는 테이블에 데이터 넣기: NOT NULL, DEFAULT
오늘은 DB 다루면서 꼭 알아야 할 또 하나의 중요한 부분을 자세히 볼 거야 — NOT NULL이랑 DEFAULT 제약조건이 있는 테이블에 데이터를 어떻게 넣는지! 이제 INSERT INTO 기본 문법은 이미 익혔고, 테이블 구조에 맞게 행을 추가하는 것도 알지? 이제 좀 더 깊게 들어가보자 — 제약조건은 개발자들한테 진짜 골치 아픈 부분이거든. 근데 걱정 마! 이 강의 끝나면 너도 이거 완전 잘 다룰 수 있을 거야!
제약조건이 뭐야?
제약조건은 테이블 컬럼에 걸리는 규칙이야. 이 규칙 덕분에 데이터가 논리적으로 맞게 저장돼. 예를 들어, 꼭 값이 있어야 하는 필드는 비워둘 수 없어(NOT NULL), 아니면 미리 정해둔 기본값이 있으면 값을 안 넣어도 자동으로 들어가(DEFAULT).
제약조건 종류: - NOT NULL — 이 컬럼에는 NULL이 들어갈 수 없어. - DEFAULT — 값을 안 넣으면 자동으로 이 값이 들어가.
제약조건은 데이터 무결성을 지켜줘. 예를 들어, students 테이블에 학생 목록을 저장한다고 해보자. 그리고 규칙 중 하나가 — 학생마다 이름이 꼭 있어야 해(NOT NULL). 이 제약조건이 없으면 누가 이름을 빼먹고 입력해서 DB에 "이름 없는 학생"이 생길 수도 있지. 또 다른 예시: 새로 만든 강좌의 학점 기본값을 0으로 정해두면(DEFAULT), 매번 신경 안 써도 돼.
NOT NULL 제약조건 다루기
NOT NULL 제약조건이 있으면, 레코드 추가할 때 꼭 값을 넣어야 해. 만약 이 컬럼에 NULL을 넣거나 아예 빼먹으면, DB가 "삐짐" (에러 발생). 예시로 볼게.
간단하게 students 테이블 만들어보자:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- 이름은 비워둘 수 없어
age INT
);
봐봐: name 컬럼에는 NOT NULL 제약조건이 있고, age는 그런 거 없어.
NOT NULL로 데이터 넣기 예시
이제 학생들 추가해보자:
-- 성공적으로 추가
INSERT INTO students (name, age) VALUES ('Alice', 23);
-- 성공: 이름이 있어서 NOT NULL 조건 만족
-- 에러 예시:
INSERT INTO students (age) VALUES (30);
-- 에러: name 컬럼은 NULL이 될 수 없어서 NOT NULL 조건 위반
만약 null value in column "name" violates not-null constraint 같은 에러가 뜨면, 놀라지 마 — PostgreSQL이 너한테 좀 더 신경 쓰라고 알려주는 거야.
기본값(DEFAULT) 사용하기
DEFAULT 제약조건은 DB한테 "혹시 이 컬럼 값 안 넣으면, 이 값 써줘"라고 말하는 거야. 이거 덕분에 개발자는 매번 다 입력 안 해도 돼서 편해.
DEFAULT 제약조건이 있는 테이블 예시
courses 테이블 만들어보자:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
credits INT DEFAULT 0 -- credits 컬럼의 기본값은 0
);
DEFAULT로 데이터 넣기 예시
이제 강좌 추가해보자:
-- credits 값을 명시적으로 넣음
INSERT INTO courses (name, credits) VALUES ('Mathematics', 5);
-- credits 값을 안 넣으면 기본값(0)이 들어감
INSERT INTO courses (name) VALUES ('History');
-- 결과 확인
SELECT * FROM courses;
결과:
| id | name | credits |
|---|---|---|
| 1 | Mathematics | 5 |
| 2 | History | 0 |
봐봐: History 강좌 추가할 때 credits 값을 안 넣었는데, PostgreSQL이 credits 컬럼을 0으로 자동 채워줬지.
NOT NULL이랑 DEFAULT 같이 쓰기
이런 컬럼은 값을 꼭 가져야 해. 네가 직접 안 넣어도! 예를 들어, courses 테이블에서 credits 컬럼에 DEFAULT랑 NOT NULL을 같이 걸면, 누가 실수로 NULL로 남겨두는 걸 막을 수 있어.
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
credits INT NOT NULL DEFAULT 0
);
데이터 넣기 예시
새로 만든 강좌는 기본적으로 0 학점을 가져야 하고, NULL은 절대 안 돼.
-- 성공: credits는 기본값으로 0이 들어감
INSERT INTO courses (name) VALUES ('Physics');
-- 에러: NOT NULL 컬럼에 NULL을 명시적으로 넣으려 함
INSERT INTO courses (name, credits) VALUES ('Chemistry', NULL);
예시: 이름이 꼭 필요한 학생 추가하기
students 테이블을 제약조건과 함께 만들어보자:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- 이름은 필수
enrollment_date DATE DEFAULT CURRENT_DATE -- 등록일 기본값은 오늘 날짜
);
이제 학생들 추가해보자:
-- 이름을 넣었으니 등록일은 자동으로 채워짐
INSERT INTO students (name) VALUES ('Bob');
-- 이름을 안 넣으면 (에러 발생)
INSERT INTO students (enrollment_date) VALUES ('2024-10-01');
이렇게 PostgreSQL이 데이터의 정확성을 보장해줘: 모든 학생은 이름이 꼭 있고, 등록일은 굳이 안 넣어도 돼.
꿀팁 & 자주 하는 실수
NOT NULL이랑 DEFAULT 제약조건 쓸 때 꼭 기억해야 할 게 있어. 예를 들어, 데이터에 NULL이 자주 나오면 NOT NULL이 진짜 골치 아플 수 있어. 또 모든 컬럼에 기본값을 주면, 진짜 값 대신 0 같은 잘못된 데이터가 들어갈 수도 있지.
보통 기존 테이블에 새 컬럼을 추가하면, 기존 행들은 그 컬럼이 NULL로 채워져. 근데 DEFAULT X를 지정하면, 그 컬럼이 전부 X로 채워져. 이거 진짜 편하고, DB 무결성 유지에 도움돼.
예를 들어, 새 컬럼이 기존 테이블을 참조하는 FOREING KEY라면, NULL이나 0이 들어가면 안 되고, 반드시 기존 테이블의 행을 참조해야 해.
제약조건 추가하는 걸 까먹었을 때는?
걱정 마 — 제약조건은 나중에 ALTER TABLE로 추가할 수 있어. 예시:
-- 기존 컬럼에 DEFAULT 제약조건 추가
ALTER TABLE courses ALTER COLUMN credits SET DEFAULT 0;
-- 기존 컬럼에 NOT NULL 제약조건 추가
ALTER TABLE students ALTER COLUMN name SET NOT NULL;
이 쿼리들은 이미 데이터가 들어있는 테이블에도 쓸 수 있어 — 기존 데이터 안 망가져.
이제 PostgreSQL의 강력한 제약조건 기능을 제대로 쓸 준비가 됐어! 네 데이터는 더 구조적이고, 실수에도 안전해지고, 쿼리도 더 논리적이고 예측 가능해질 거야.
GO TO FULL VERSION