728x90
제약 조건이란?
테이블에 저장되는 데이터의 정확성과 일관성을 보장하기 위해 사용되는 SQL의 규칙이 바로 제약 조건이다.
주로 테이블을 생성할 때(CREATE TABLE
) 또는 수정할 때(ALTER TABLE
) 정의하며, 데이터의 무결성을 유지하는 핵심 도구다.
왜 제약 조건을 사용할까?
데이터베이스는 신뢰할 수 있는 데이터를 저장하는 것이 목적이다.
제약 조건이 없다면 잘못된 값, 중복 값, NULL 값 등이 테이블에 삽입될 수 있다.
예를 들자면 아래와 같은 경우를 막기 위해 제약 조건을 사용한다고 생각하면 된다.
- 고객 ID가 중복되면 안 되는데, 중복 입력되는 경우
- 부서 번호가 존재하지 않는데 참조하는 경우
- 급여가 0보다 작게 들어가는 경우
특징
제약 조건은 아래와 같은 특징들을 가진다.
- 데이터베이스 수준에서 실행
- 어플리케이션이 아닌 DB 자체에서 데이터 검증을 수행한다.
- 선언적 방식
- 별도 로직 없이
CREATE TABLE
등에서 설정이 가능하다.
- 별도 로직 없이
- 자동 작동
- 값 삽입 및 수정시 자동으로 조건을 검사한다.
- 명확한 오류 발생
- 조건 위반 시 명확한 에러 메시지를 제공한다.
제약 조건의 종류
제약 조건 | 목적 | 중복 허용 | NULL 허용 | 특징 |
PRIMARY KEY |
고유 식별자 | ❌ | ❌ | 한 테이블에 하나만 존재 가능 |
UNIQUE |
중복 방지 | ❌ | ✅ | 여러 개 설정 가능 |
CHECK |
값 범위 조건 | ✅ | ✅ | 조건을 만족해야 입력 가능 |
DEFAULT |
기본값 설정 | ✅ | ✅ | 값이 없을 때 자동으로 채워짐 |
FOREIGN KEY |
테이블 간 관계 설정 | ✅ | ✅ | 참조 테이블의 값만 허용, 삭제/수정 옵션 존재 |
사용 예시
1. PRIMARY KEY
(기본 키)
각 행을 고유하게 식별하기 위한 제약 조건
고유 식별 키라 부름
CREATE TABLE users (
user_id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);
INSERT INTO users VALUES (1, 'Alice', 25);
INSERT INTO users VALUES (2, 'Bob', 30);
-- INSERT INTO users VALUES (1, 'Charlie', 22); -- 오류! user_id 중복
결과
user_id | name | age |
1 | Alice | 25 |
2 | Bob | 30 |
2. UNIQUE
(유일성 제약)
특정한 컬럼의 값이 중복되지 않도록 보장한다.
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,
name VARCHAR(50)
);
INSERT INTO employees VALUES (101, 'alice@email.com', 'Alice');
INSERT INTO employees VALUES (102, 'bob@email.com', 'Bob');
-- INSERT INTO employees VALUES (103, 'alice@email.com', 'Charlie'); -- 오류! 중복된 이메일
결과
emp_id | name | |
101 | alice@email.com | Alice |
102 | bob@email.com | Bob |
3. CHECK
(검사 조건)
컬럼 값이 특정 조건을 만족해야만 입력 가능하게 한다.
CREATE TABLE products (
product_id INT PRIMARY KEY,
name VARCHAR(100),
price INT CHECK (price > 0)
);
INSERT INTO products VALUES (1, 'Laptop', 1500);
-- INSERT INTO products VALUES (2, 'Mouse', -500); -- 오류! price는 0보다 커야 함
결과
product_id | name | price |
1 | Laptop | 1500 |
4. DEFAULT (기본값 설정)
값을 지정하지 않을 경우 자동으로 기본값을 설정한다.
CREATE TABLE posts (
post_id INT PRIMARY KEY,
title VARCHAR(100),
views INT DEFAULT 0
);
INSERT INTO posts (post_id, title) VALUES (1, '첫 번째 게시물');
INSERT INTO posts VALUES (2, '두 번째 게시물', 100);
결과
post_id | title | views |
1 | 첫 번째 게시물 | 0 |
2 | 두 번째 게시물 | 100 |
5. FOREIGN KEY (외래 키)
다른 테이블의 기본 키(PRIMARY KEY
)를 참조하여 관계를 설정한다.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
-- 부모 테이블
INSERT INTO customers VALUES (1, 'Alice');
INSERT INTO customers VALUES (2, 'Bob');
-- 자식 테이블
INSERT INTO orders VALUES (101, 1, '2024-04-01');
INSERT INTO orders VALUES (102, 2, '2024-04-02');
-- INSERT INTO orders VALUES (103, 3, '2024-04-03'); -- 오류! 존재하지 않는 고객 ID
결과
order_id | customer_id | order_date |
101 | 1 | 2024 |
102 | 2 | 2024-04-02 |
728x90
'DB' 카테고리의 다른 글
[DB] SQL - VIEW 개념 파헤치기 (0) | 2025.04.03 |
---|---|
[DB] SQL - 데이터베이스에서의 CRUD (0) | 2025.04.03 |
[DB] SQL - 상호 연관 서브쿼리란? (0) | 2025.04.02 |
[DB] SQL - 서브 쿼리를 이용한 동적 쿼리 활용 방법 (0) | 2025.04.02 |
[DB] SQL - 단일 행, 다중 행, 다중 열 서브쿼리 개념 정리 (0) | 2025.04.01 |