1. 개체 무결성 (Entity Integrity)
모든 테이블의 각 행은 유일해야 한다.
이는 기본 키(PRIMARY KEY) 를 통해 보장된다. 기본 키는 해당 테이블의 각 레코드를 유일하게 식별하는 역할을 하며, NULL 값을 가질 수 없고, 중복도 허용되지 않는다.
CREATE TABLE students (
student_id INT PRIMARY KEY,
student_name VARCHAR(20),
student_gender CHAR(1)
);
위에서 student_id는 학번처럼 각 학생을 고유하게 식별할 수 있는 값이다. 같은 학번이 두 번 입력되거나, 학번 없이 입력되는 일이 없도록 제약한다.
주요 예시
- 주민등록번호
- 주문 번호
- 아이디
- 제품 코드
핵심 속성:
- NOT NULL
- UNIQUE
2. 참조 무결성 (Referential Integrity)
테이블 간의 관계를 정의할 때, 참조하는 값이 반드시 존재해야 한다.
외래 키(FOREIGN KEY)를 사용하여 구현하며, 이는 다른 테이블의 기본 키를 참조한다. 참조된 값이 실제로 존재하지 않으면 데이터 삽입/수정이 거부된다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
student_id INT,
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
이 예시에서 orders 테이블은 students 테이블을 참조한다. 존재하지 않는 student_id로 주문을 생성할 수 없기 때문에 데이터의 정합성이 보장된다.
주요 예시
- 게시글 - 댓글
- 고객 - 주문
- 사용자 - 인증 정보
핵심 개념:
- FOREIGN KEY
- REFERENCES
3. 도메인 무결성 (Domain Integrity)
컬럼 값이 정의된 도메인(타입, 범위, 형식 등)을 벗어나지 않아야 한다.
도메인은 일반적으로 다음 요소로 구성된다:
- 데이터 타입 (INT, VARCHAR, DATE 등)
- 길이 및 포맷
- 허용된 값의 범위 (CHECK, UNSIGNED, ENUM 등)
CREATE TABLE accounts (
account_id INT PRIMARY KEY,
deposit_amount INT UNSIGNED, -- 음수 불가
account_type ENUM('basic', 'premium', 'vip') -- 사전 정의된 값만 허용
);
예를 들어 입금 금액은 음수가 될 수 없기 때문에 UNSIGNED로 설정하고, 계정 유형은 특정 값만 가능하도록 ENUM을 활용한다.
주요 예시
- 나이: 0 이상 120 이하
- 이메일: 특정 형식을 만족하는 문자열
- 상품 가격: 양의 실수만 허용
핵심 도구:
- UNSIGNED
- ENUM
- CHECK
- 데이터 타입 선언
4. 사용자 정의 무결성 (User-Defined Integrity)
도메인 또는 기본 제약 조건만으로는 해결할 수 없는 비즈니스 로직 기반 무결성.
이는 애플리케이션 또는 트리거, 저장 프로시저 등을 통해 구현해야 한다.
예를 들어, 다음과 같은 규칙을 생각해보자:
- 회원 가입 시 비밀번호는 반드시 6~10자의 길이를 가지고, 영어 대소문자 + 숫자 + 특수문자를 포함해야 한다.
- 회원의 생년월일을 통해 현재 나이를 계산하고, 만 19세 이상만 가입을 허용한다.
MySQL은 복잡한 조건을 테이블 수준에서 구현하는 데 한계가 있으므로, 이러한 경우에는 서버 로직이나 프론트엔드 로직과 병행하여 처리하는 경우가 많다.
하지만 다음과 같은 간단한 조건은 CHECK를 통해 어느 정도 대응 가능하다:
CREATE TABLE members (
member_id INT PRIMARY KEY,
password VARCHAR(20),
age INT CHECK (age >= 19 AND age <= 100)
);
주요 예시
- 특정 연령 이상만 가입 가능
- 특정 포맷의 문자열 강제
- 한 테이블 내 조건부 제약 (gender가 'M'일 경우 military_service가 NULL이 아니어야 함 등)
'웹개발 > SQL(mySQL)' 카테고리의 다른 글
| MySQL DML 문법 (INSERT, UPDATE, DELETE) (0) | 2025.06.16 |
|---|---|
| MySQL 제약조건(Constraints) (4) | 2025.06.15 |
| MySQL 명명규칙 (1) | 2025.06.13 |
| MYSQL DataType (2) | 2025.06.12 |
| MySQL DDL 문법 (Data Definition Language) (1) | 2025.06.11 |