MySQL의 InnoDB 스토리지 엔진은 데이터 무결성을 보장하기 위해 다양한 제약조건을 지원한다.
| 제약 조건 | 설명 |
|---|---|
| PRIMARY KEY | 테이블의 각 행을 고유하게 식별. NULL 불가, 중복 불가 |
| UNIQUE | 중복을 허용하지 않음. NULL은 허용(단, 열당 한 번) |
| NOT NULL | NULL 값을 허용하지 않음 |
| 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는 외래 키의 옵션 중 하나로, 참조하는 부모 레코드가 삭제되거나 업데이트될 때, 자식 레코드에도 같은 작업을 자동으로 수행하도록 지정한다.
FOREIGN KEY (자식 컬럼) REFERENCES 부모 테이블(부모 컬럼)
ON DELETE CASCADE
ON UPDATE CASCADE
ON DELETE CASCADE: 부모 행이 삭제되면, 참조 중인 자식 행도 자동으로 삭제한다.ON UPDATE CASCADE: 부모 키 값이 변경되면, 자식 테이블의 외래 키도 자동으로 갱신한다.ON DELETE CASCADE는 편리하지만 위험하다.RESTRICT나 SET NULL을 고려해보자.UPDATE CASCADE는 PK 변경이 실제로 있을 때만 의미가 있다.PRIMARY KEY 또는 UNIQUE여야 한다.| 옵션 | 설명 | 행동 |
|---|---|---|
CASCADE | 부모 삭제/수정 시 자식도 같이 삭제/수정 | 자동 반영 |
RESTRICT (기본값) | 부모가 참조 중이면 삭제/수정 불가 | 에러 발생 |
SET NULL | 부모 삭제/수정 시 자식 값을 NULL로 설정 | 자식 컬럼이 NULL 허용이어야 함 |
NO ACTION | RESTRICT와 같음 (MySQL에서 차이 없음) | 에러 발생 |
ON DELETE CASCADE는 댓글, 주문, 로그 기록 등 부모에 종속적인 자식 데이터를 가질 때 유용하다.RESTRICT를 사용한다.CASCADE대힌 트리거 사용도 고려해보자.