MySQL: 제약조건

김기현·2025년 6월 15일

Database

목록 보기
8/24

MySQL의 InnoDB 스토리지 엔진은 데이터 무결성을 보장하기 위해 다양한 제약조건을 지원한다.

InnoDB의 주요 제약조건

제약 조건설명
PRIMARY KEY테이블의 각 행을 고유하게 식별. NULL 불가, 중복 불가
UNIQUE중복을 허용하지 않음. NULL은 허용(단, 열당 한 번)
NOT NULLNULL 값을 허용하지 않음
FOREIGN KEY다른 테이블의 열과 관계 설정. 참조 무결성 유지
CHECK지정한 조건을 만족하는 값만 허용 (MySQL 8.0 이상부터 지원)
DEFAULT값이 주어지지 않을 때 기본값 설정

예제

테이블 생성

CREATE TABLE users
(
    id       INT AUTO_INCREMENT PRIMARY KEY, -- PRIMARY KEY
    username VARCHAR(50)  NOT NULL UNIQUE,   -- NOT NULL + UNIQUE
    email    VARCHAR(100) NOT NULL,
    age      INT CHECK (age >= 18)           -- CHECK (MySQL 8.0+)
);

CREATE TABLE orders
(
    id         INT AUTO_INCREMENT PRIMARY KEY,
    user_id    INT            NOT NULL,
    product    VARCHAR(100)   NOT NULL,
    amount     DECIMAL(10, 2) NOT NULL CHECK (amount > 0), -- CHECK
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,         -- DEFAULT
    FOREIGN KEY (user_id) REFERENCES users (id)            -- FOREIGN KEY
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

데이터 삽입

-- 사용자 삽입
INSERT INTO users (username, email, age)
VALUES ('alice', 'alice@example.com', 25);

-- 주문 삽입
INSERT INTO orders (user_id, product, amount)
VALUES (1, 'Laptop', 1200.50);

CASCADE

CASCADE는 외래 키의 옵션 중 하나로, 참조하는 부모 레코드가 삭제되거나 업데이트될 때, 자식 레코드에도 같은 작업을 자동으로 수행하도록 지정한다.

FOREIGN KEY (자식 컬럼) REFERENCES 부모 테이블(부모 컬럼)
    ON DELETE CASCADE
    ON UPDATE CASCADE

CASCADE의 용도

  • ON DELETE CASCADE: 부모 행이 삭제되면, 참조 중인 자식 행도 자동으로 삭제한다.
  • ON UPDATE CASCADE: 부모 키 값이 변경되면, 자식 테이블의 외래 키도 자동으로 갱신한다.

주의사항

  1. ON DELETE CASCADE는 편리하지만 위험하다.
    • 실수로 부모 레코드를 삭제하면 관련된 모든 자식 데이터도 삭제된다.
    • 신중하게 사용해야 하며, 필요하다면 RESTRICTSET NULL을 고려해보자.
  2. UPDATE CASCADE는 PK 변경이 실제로 있을 때만 의미가 있다.
    • 실무에서는 PK를 변경하는 경우가 거의 없음
  3. 외래 키로 참조되는 열은 반드시 PRIMARY KEY 또는 UNIQUE여야 한다.

대안 옵션

옵션설명행동
CASCADE부모 삭제/수정 시 자식도 같이 삭제/수정자동 반영
RESTRICT (기본값)부모가 참조 중이면 삭제/수정 불가에러 발생
SET NULL부모 삭제/수정 시 자식 값을 NULL로 설정자식 컬럼이 NULL 허용이어야 함
NO ACTIONRESTRICT와 같음 (MySQL에서 차이 없음)에러 발생

  • ON DELETE CASCADE는 댓글, 주문, 로그 기록 등 부모에 종속적인 자식 데이터를 가질 때 유용하다.
  • 보안 또는 회계 관련 데이터는 의도치 않은 삭제 방지를 위해 RESTRICT를 사용한다.
  • 비즈니스 로직이 복잡하면 CASCADE대힌 트리거 사용도 고려해보자.
profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글