
안녕하세요 오늘은 제약조건에 대해 알아볼게요!
제약조건(Constraint)
제약조건은 데이터의 정확성, 일관성, 신뢰성, 무결성을 유지하기 위해
DB 시스템을 활용하여 강제하는 규칙이에요.
제약조건 사용 목적은 잘못된 데이터를 삽입 방지를 위해 (무결성 유지)
잘못된 입력, 삭제, 변경 등을 방지하기 위해 (오류방지)
테이블 간의 연결을 확실하게 유지하기 위해(관계 유지)가 있습니다.
제약조건의 종류
제약 조건의 종류는
기본키(Primary Key), 외래, 참조키(Foriegn Key), Unique, Check, NOT NULL, Defaut 가 있어요.
그럼 하나하나 알아볼까요?
기본키(Primary Key)
기본키-PK는 각 행을 고유하게 구분하는 역할로(레코드 구분의 식별자)
중복될 수 없고(고유성), Null 허용이 불가능하기 때문에 반드시 유효한 데이터가 포함되어야 해요.
create table `students` (
# student_id bigint primary key,
student_id bigint,
name varchar(100),
primary key (student_id)
);
외래, 참조키(Foreign Key)
외래, 참조키-FK는 두 테이블 사이의 관계를 연결하여 데이터의 무결성을 유지시켜 주고,
다른 두 테이블의 기본키-PK를 참조하여 관계를 표현해 줍니다.
create table `members` (
member_id bigint primary key,
name varchar(100)
);
create table `orders`(
order_id bigint primary key,
order_date date,
member_id bigint, -- 주문자 정보
# 외래 키 지정 방법
# foreign key (참조컬럼, 현 테이블의 컬럼명) references 기본테이블(기본컬럼, pk컬럼)
foreign key (member_id) references `members`(member_id)
);
- 두 테이블 간 연결 (RDBMS)
+) 기본 테이블 (기본 키가 있는 테이블)
+) 참조 테이블 (외래 키가 있는 테이블)
Unique
Unique는 특정 열의 값이 중복되면 안 되고(PK의 공통점),
Null 허용이 가능합니다.(PK와의 차이점)
그리고 한 테이블에 여러 개 지정이 가능합니다.(PK와의 차이점)
Unique의 사용예시는 아이디, 이메일, 주민등록번호 등에 사용해요.
create table `users` (
user_id bigint primary key,
username varchar(100) unique,
password varchar(100),
email varchar(100)unique,
resident_number varchar(100) unique
);
insert into `users`
values
(1, 'qwe123', 'qwe123123', 'qwe123@example.com', '123456');
insert into `users`
values
(2, 'ewr134', 'ewq234234', null, '654321');
-- unique는 null값 삽입 가능
Check
Check는 입력값이 특정 조건을 만족해야만 삽입이 가능하다는 특징을 가지고 있어요.
create table employees (
employee_id bigint primary key,
name varchar(100),
age int,
# check 제약 조건 사용 방법
# check(조건 작성 - 조건식은 다양한 연산자 사용)
check(age >= 20)
);
insert into `employees`
values
(1, '김철수' , 30),
(2, '왕눈이' , 20),
-- (3, '김하나' , 10),
(4, '김태양' , 30);
# Error Code: 3819. Check constraint 'employees_chk_1' is violated. 0.016 sec
insert into `employees`
values
(5, '신짱구', null); -- check 제약 조건은 null 여부 확인
NOT NULL
NOT NULL은 특정열에 NULL 값을 허용하지 않아요.
즉 비워둘 수 없다는 특징을 가지고 있어요.
create table `contacts` (
contact_id bigint primary key, -- PK은 자동 not null
name varchar(100) not null,
phone varchar(100) not null
);
insert into `contacts`
values
(1, '김큐엘', '010-1111-2222'),
(2, '나자바', '010-2222-3333');
-- (2,'나자바', null); 'phone' cannot be null 0.000 sec
default
default는 테이블의 열에 값이 입력되지 않으면 자동으로 기본값을 넣어주는 제약 조건으로
선택적 필드에 대한 입력을 단순화(데이터 무결성 유지)시키는 특징을 가지고 있어요.
create table `carts` (
cart_id bigint primary key,
product_name varchar(100),
# default 제약조건
# 컬럼명 데이터타입 default 기본값(데이터타입 지키기)
quantity int default 1
);
insert into `carts`
values
(1, '노트북', 3),
(2, '스마트폰', null),
(3, '태블릿', 2);
-- default 설정 컬럼을 비워둘 수는 없음
-- null값 입력 시 null 값이 지정 가능 (기본값 설정 X)
select * from `carts`;
# default 값 사용 방법
# 컬럼 자체에 값 대입
insert into `carts`
values
# carts의 컬럼을 정의 순서대로 데이터 전달
# : quantity 수량을 제외한 데이터를 전달할 경우
# > 테이블 명 옆에(삽입하고자 하는 컬럼명만 나열)
();
insert into `carts` (cart_id, product_name)
values
(4, '이어폰'),
(5, '스마트폰');
select * from `carts`;
+추가 자료+
제약조건은 여러 개 동시에 지정이 가능해요.
# EX) NOT NULL + CHECK
create table `multiple` (
multiple_col int not null check(multiple_col > 10)
);
insert into `multiple`
values
(11);

여기까지 SQL의 제약조건을 알아봤는데요.
제약조건을 잘 활용하면 데이터베이스의 정확성과 오류를 방지할 수 있을 것 같아요.
'Backend > MySQL' 카테고리의 다른 글
| SQL - Subquery (5) | 2025.08.10 |
|---|---|
| SQL - Select (6) | 2025.08.09 |
| SQL의 무결성 (4) | 2025.08.05 |
| SQL의 기초 - 데이터베이스 (10) | 2025.08.03 |
| MySQL 설치 및 적용방법 (5) | 2025.08.01 |