테이블에 데이터를 넣는 건 INSERT 하나면 된다. 그런데 아무 값이나 다 들어가도 되는 건 아니다. 이름 없는 회원, 중복된 이메일, 음수 가격 — 이런 데이터가 쌓이기 시작하면 DB가 금방 엉망이 된다. 제약 조건(Constraint)은 처음부터 잘못된 데이터가 들어오지 못하게 막는 규칙이다.
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...);
앞서 만든 members 테이블에 데이터를 넣는다면 이렇게 된다.
INSERT INTO members (member_name, email)
VALUES ('김민수', 'kim@email.com');
컬럼 순서와 값 순서가 일치해야 한다. member_id는 AUTO_INCREMENT라 생략해도 자동으로 채워진다.
여러 행을 한 번에 넣을 때는 VALUES 뒤에 이어 붙이면 된다.
INSERT INTO members (member_name, email)
VALUES ('김민수', 'kim@email.com'),
('이지현', 'lee@email.com'),
('박준혁', 'park@email.com');
제약 조건은 테이블을 만들 때 컬럼에 붙여두는 규칙이다. 이 규칙을 어기는 INSERT는 DB가 거절한다.

값이 반드시 있어야 한다. NULL을 허용하지 않는다.
CREATE TABLE members (
member_id INT PRIMARY KEY AUTO_INCREMENT,
member_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
member_name 없이 INSERT를 시도하면 오류가 난다.
-- 오류: member_name은 NOT NULL이라 NULL이 들어갈 수 없다
INSERT INTO members (email) VALUES ('kim@email.com');
같은 값이 두 번 들어올 수 없다. 이메일처럼 중복을 허용하면 안 되는 컬럼에 쓴다.
CREATE TABLE members (
member_id INT PRIMARY KEY AUTO_INCREMENT,
member_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE
);
INSERT INTO members (member_name, email) VALUES ('김민수', 'kim@email.com');
-- 오류: email이 UNIQUE인데 이미 동일한 값이 존재한다
INSERT INTO members (member_name, email) VALUES ('김민수2', 'kim@email.com');
PRIMARY KEY도 내부적으로 UNIQUE + NOT NULL이 적용된 것이다.
값을 넣지 않았을 때 자동으로 들어갈 기본값을 지정한다.
CREATE TABLE members (
member_id INT PRIMARY KEY AUTO_INCREMENT,
member_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
is_active를 생략하고 INSERT하면 자동으로 TRUE가 들어간다. created_at은 INSERT 시각이 자동으로 저장된다.
-- is_active, created_at 생략해도 자동으로 채워진다
INSERT INTO members (member_name, email)
VALUES ('김민수', 'kim@email.com');
컬럼에 들어올 수 있는 값의 범위나 조건을 직접 지정한다.
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
price INT NOT NULL CHECK (price > 0),
stock INT DEFAULT 0 CHECK (stock >= 0)
);
가격이 0 이하이거나 재고가 음수인 데이터는 INSERT 자체가 안 된다.
-- 오류: price는 0보다 커야 한다
INSERT INTO products (product_name, price) VALUES ('무선 마우스', -1000);
| 제약 조건 | 역할 |
|---|---|
NOT NULL | NULL 허용 안 함 |
UNIQUE | 중복값 허용 안 함 |
DEFAULT | 기본값 지정 |
CHECK | 값의 조건 지정 |
PRIMARY KEY | NOT NULL + UNIQUE, 행의 고유 식별자 |
제약 조건은 애플리케이션 코드에서 유효성 검사를 하더라도, DB 레벨에서 한 번 더 걸어두는 게 안전하다. 코드에 버그가 생기거나, 다른 경로로 데이터가 들어오더라도 DB가 최후의 방어선 역할을 한다.