본문 바로가기

DB

[DB] SQL - CREATE TABLE과 함께 쓰는 제약 조건이란?

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 email 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