728x90
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100) UNIQUE,
-- 복합 UNIQUE 제약조건
first_name VARCHAR(50),
last_name VARCHAR(50),
UNIQUE (first_name, last_name)
);
-- 기존 테이블에 UNIQUE 추가
ALTER TABLE users
ADD CONSTRAINT unique_email UNIQUE (email);
데이터베이스에서 제약조건(Constraints)는 마치 교통 신호등과 같은 역할을 한다고 보면 된다.
교통 신호등이 차량의 안전한 흐름을 보장하듯이, 제약조건은 데이터의 정확성과 일관성을 보장한다.
이번 글에서는 각각의 제약조건들이 어떤 역할을 하는지 정리해보려고 한다.
NOT NULL 제약조건
NOT NULL은 가장 기본적인 제약조건으로, 해당 열에 NULL 값이 들어가는 것을 방지한다.
예를 들어, 회원가입 시 이메일은 반드시 필요한 정보라면 다음과 같이 설정할 수 있다.
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
-- NOT NULL이 없는 선택적 정보
phone VARCHAR(20)
);
-- 기존 열을 NOT NULL로 변경
ALTER TABLE users
MODIFY email VARCHAR(100) NOT NULL;
UNIQUE 제약조건
UNIQUE 제약조건은 해당 열의 모든 값이 서로 달라야 함을 보장한다.
이메일 주소나 사용자 아이디처럼 중복되면 안 되는 정보에 사용한다.
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100) UNIQUE,
-- 복합 UNIQUE 제약조건
first_name VARCHAR(50),
last_name VARCHAR(50),
UNIQUE (first_name, last_name)
);
-- 기존 테이블에 UNIQUE 추가
ALTER TABLE users
ADD CONSTRAINT unique_email UNIQUE (email);
PRIMARY KEY 제약조건
PRIMARY KEY는 테이블의 각 행을 고유하게 식별하는 열이다.
주민등록번호나 학번처럼 각 데이터를 구분할 수 있는 유일한 식별자 역할을한다.
CREATE TABLE students (
-- 자동 증가하는 기본 키
student_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
enrollment_date DATE NOT NULL
);
-- 복합 기본 키 예시
CREATE TABLE course_enrollments (
student_id INT,
course_id INT,
enrollment_date DATE,
PRIMARY KEY (student_id, course_id)
);
FOREIGN KEY 제약조건
FOREIGN KEY는 테이블 간의 관계를 정의한다.
마치 부서와 직원의 관계처럼, 한 테이블의 데이터가 다른 테이블의 데이터를 참조할 때 사용된다.
-- 부서 테이블
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50) NOT NULL
);
-- 직원 테이블
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
dept_id INT,
FOREIGN KEY (dept_id)
REFERENCES departments(dept_id)
ON DELETE SET NULL -- 부서가 삭제되면 NULL로 설정
ON UPDATE CASCADE -- 부서 ID가 변경되면 자동 업데이트
);
-- 기존 테이블에 외래 키 추가
ALTER TABLE employees
ADD CONSTRAINT fk_department
FOREIGN KEY (dept_id) REFERENCES departments(dept_id);
각각의 제약조건이 어떻게 데이터의 품질을 보장하는지 예시를 들어보자.
-- 온라인 쇼핑몰 주문 시스템 예시
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
-- 주문은 반드시 고객이 있어야 함
customer_id INT NOT NULL,
-- 주문 날짜는 필수이며, 기본값은 현재 시간
order_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- 주문 상태는 제한된 값만 가능
status VARCHAR(20) CHECK (status IN ('pending', 'processing', 'shipped', 'delivered')),
-- 총액은 음수가 될 수 없음
total_amount DECIMAL(10,2) CHECK (total_amount >= 0),
-- 외래 키로 고객 테이블 참조
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
ON DELETE RESTRICT -- 주문이 있는 고객은 삭제 불가
);
728x90
'SQL' 카테고리의 다른 글
[SQL] SQL 접속하기 (기초) (0) | 2025.01.12 |
---|---|
[SQL] MySQL 고급 기능 마스터하기 - CHECK부터 VIEW까지 (0) | 2025.01.09 |
[SQL] MySQL 데이터베이스 구조 설계하기 - 생성부터 삭제까지 (0) | 2025.01.09 |
[SQL] SQL 고급 기능 완전 정복 - UNION부터 CASE문까지 (0) | 2025.01.09 |
[SQL] SQL 고급 문법 이해하기 - IN, JOIN, 테이블 관계 활용 (0) | 2025.01.09 |