제약 조건(Constraints) 이란?
: 데이터의 정확성, 일관성, 신뢰성, 무결성을 유지하기 위해 DB 시스템에서 강제하는 규칙이다.
제약 조건을 사용하는 목적
- 잘못된 데이터 입력을 방지
- 테이블 간 관계를 명확히 유지
- 신뢰할 수 있는 데이터베이스 상태 유지
제약 조건의 종류
- PRIMARY KEY
- FOREIGN KEY
- UNIQUE
- CHECK
- NOT NULL
- DEFAULT
1. PRIMARY KEY (기본 키)
- 테이블의 각 행을 고유하게 식별할 수 있는 열
- 중복 불가 + NULL 불가
- 테이블당 하나만 설정 가능
create table students (
student_id int primary key,
name varchar(100),
major varchar(100)
);
또는 아래와 같이 마지막에 명시할 수도 있다:
create table students (
student_id int,
name varchar(100),
major varchar(100),
primary key (student_id)
);
기본 키 제약 조건 수정
-- 삭제
alter table students drop primary key;
-- 다시 추가
alter table students add primary key (student_id);
✅ 복합 키 (Composite Primary Key)
기본 키는 하나의 열만이 아니라 여러 컬럼을 조합하여 설정할 수도 있다.
create table enrollments (
student_id int,
course_id int,
primary key (student_id, course_id)
);
- 각각의 컬럼은 중복될 수 있지만, 조합된 값은 반드시 유일해야 한다.
2. FOREIGN KEY (외래 키)
- 두 테이블 간 관계를 연결하는 역할
- 참조하는 테이블의 기본 키를 기준으로 설정
- 데이터의 연관성을 강제하며, 잘못된 참조를 막는다
create table members (
member_id int primary key,
name varchar(100)
);
create table orders (
order_id int primary key,
order_date date,
member_id int,
foreign key (member_id) references members(member_id)
);
외래 키 제약 조건 수정
-- 외래 키 삭제
alter table orders drop foreign key orders_ibfk_1;
-- 외래 키 다시 추가
alter table orders add constraint
foreign key (member_id)
references members(member_id);
외래 키 제약 조건 이름 확인
select constraint_name
from information_schema.key_column_usage
where table_name = 'orders' and column_name = 'member_id';
✅ 외래 키: ON DELETE / ON UPDATE
외래 키 설정 시 참조 대상이 삭제되거나 변경될 경우의 동작을 명시할 수 있다.
create table orders (
order_id int primary key,
member_id int,
foreign key (member_id)
references members(member_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
- ON DELETE CASCADE: 참조 대상 삭제 시, 해당 데이터도 함께 삭제됨
- ON DELETE SET NULL: 참조 대상 삭제 시, 해당 값을 NULL로 설정
- ON DELETE RESTRICT: 참조 중이면 삭제 금지 (기본값)
- ON UPDATE CASCADE: 참조 대상 값 변경 시, 해당 값도 같이 변경됨
3. UNIQUE
- 특정 컬럼의 값이 모두 고유해야 함
- 한 테이블에 여러 개 설정 가능
- NULL 값은 허용된다 (PK와의 차이점)
create table users (
user_id int primary key,
user_email varchar(100) unique,
user_number varchar(100) unique
);
4. CHECK
- 입력되는 값이 특정 조건을 만족해야 한다
- MySQL 8.0.16 이상에서만 유효하게 동작
create table employees (
id int primary key,
name varchar(100),
age int,
check (age >= 20)
);
-- 실패 예시
insert into employees values (2, '조민지', 19); -- ❌ 조건 위반
-- 성공 예시
insert into employees values (1, '진우태', 20);
5. NOT NULL
- 해당 컬럼은 절대 비워질 수 없음
- 기본 키에 대해서는 자동으로 NOT NULL이 포함됨
create table contacts (
contact_id int primary key,
name varchar(100) not null,
phone varchar(100) not null
);
-- 실패 예시
insert into contacts values (2, '양현석', null); -- ❌ phone에 NULL 불가
6. DEFAULT
- 데이터를 삽입할 때 해당 컬럼에 값이 없으면 기본값을 자동으로 설정
create table cart (
cart_id int primary key,
product_name varchar(100),
quantity int default 1
);
-- quantity를 명시하지 않아도 기본값 1 삽입
insert into cart (cart_id, product_name) values (4, '이어폰');
주의! NULL을 명시하면 DEFAULT는 무시된다.
insert into cart values (2, '스마트폰', null); -- ❌ null 그대로 들어감
'웹개발 > SQL(mySQL)' 카테고리의 다른 글
| MySQL SELECT 문 사용방법 (0) | 2025.06.17 |
|---|---|
| MySQL DML 문법 (INSERT, UPDATE, DELETE) (0) | 2025.06.16 |
| 무결성(Integrity) (1) | 2025.06.14 |
| MySQL 명명규칙 (1) | 2025.06.13 |
| MYSQL DataType (2) | 2025.06.12 |