hanker

SQL - 데이터 무결성(Data Integrity)과 제약조건(Constraints) 쉽게 이해하기 본문

카테고리 없음

SQL - 데이터 무결성(Data Integrity)과 제약조건(Constraints) 쉽게 이해하기

hanker 2025. 1. 14. 00:00
반응형

데이터베이스의 가장 중요한 목표 중 하나는 데이터 무결성(Data Integrity)을 유지하는 것이다.

"데이터 무결성은 데이터가 정확하고 신뢰할 수 있는 상태를 유지하도록 보장하며, 이를 위해 SQL에서는 다양한 제약조건(Constraints)을 제공한다." 라고 정의가 되어 있는데, 전혀 와닿지 않는다.

 

이번 글에서는 데이터 무결성의 개념과 SQL 제약조건의 종류 및 활용 방법에 대해서 쉽게 알아보자!

 


1. 데이터 무결성(Data Integrity)이란?

 

데이터 무결성은 데이터베이스 내 데이터가 생성부터 삭제까지의 모든 과정에서 정확하고 일관되며 완전한 상태를 유지하는 것을 의미한다.

즉, 데이터가 의도하지 않았는데 변경되거나 손상되지 않게 보장하는 것이다.

 

1-1. 주요 요소

- 정확성 : 데이터에 오류나 왜곡이 없어야함

- 일관성 : 데이터가 서로 모순되지 않고, 동일한 기준과 형식을 유지해야함 

- 완전성 : 필요한 모든 데이터가 빠짐없이 존재하며, 누락이나 중복이 없어야 함

 

 

1-2. 데이터 무결성을 유지하기 위한 제약 조건

- 개체 무결성(Entity Integrity) : 데이터베이스의 각 테이블은 고유한 기본 키(Primary Key)를 가져야 하며, 이 키는 중복 또는 비어 있을 수 없다.

- 참조 무결성(Referential Integrity) : 외래 키 (Foreign Key)를 통해 연결된 테이블 간의 데이터 관계가 항상 유효하도록 보장한다.

- 도메인 무결성(Domain Integrity) : 각 데이터 필드에 허용되는 값의 범위나 형식을 정의하여, 올바른 데이터만 입력되도록 한다.

 

각 제약조건별로 예를 들어보자.

사람들이 음식점에 들어와서 음식을 시킬 때 키오스크에서 세트A 메뉴를 주문하고 주문번호를 받는다.

주방에서는 주문번호와 세트A라는 문구가 적힌 정보를 제공받는다. 여기에서 주방장은 세트A에 대한 음식 종류를 보고 음식을 시작한다. 

해당 세트 메뉴가 완료되면 주문번호를 불러서 세트메뉴가 나왔다고 알린다.

 

이때 주문 번호는 기본 키(Primary Key)가 된다. 

이 주문 번호는 서로 달라야 하며, 비어 있을 수 없다. 주방에서 주문번호와 세트A 메뉴가 적힌 정보를 받을 때 세트A 의 구성이 짜장면과 탕수육이라는 걸 알게되는 것이 외래 키(Foreign Key) 때문이다.

 


2. SQL 제약조건(Constraints)의 종류

 

SQL 제약조건은 테이블의 열이나 데이터에 무결성을 보장하기 위해 사용된다.

제약조건 설명
PRIMARY KEY 각 행을 고유하게 식별하며 NULL 값을 허용하지 않음
FOREIGN KEY 다른 테이블의 열과 참조 관계를 정의함
UNIQUE 열 값이 고유해야 함
NOT NULL 열 값이 NULL을 허용하지 않음
CHECK 특정 조건을 만족해야 함
DEFAULT 열에 기본값을 제공함

 


3. 제약조건 사용 방법

 

3-1. 테이블 생성 시 제약조건 추가

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,                  -- 기본 키
    name VARCHAR(100) NOT NULL,                  -- NULL 불가
    department_id INT,
    salary DECIMAL(10, 2) CHECK (salary > 0),    -- 급여는 0보다 커야 함
    manager_id INT DEFAULT NULL,
    FOREIGN KEY (department_id) REFERENCES departments(department_id) -- 참조 무결성
);

 

 

3-2. 테이블 생성 후 제약조건 추가

ALTER TABLE employees
ADD CONSTRAINT unique_email UNIQUE (email);
# UNIQUE 제약조건 추가

ALTER TABLE employees
ADD CONSTRAINT fk_department
FOREIGN KEY (department_id)
REFERENCES departments(department_id);
# FOREIGN KEY 제약조건 추가

 

 

3-3. 제약조건 삭제

 

ALTER TABLE employees
DROP CONSTRAINT employee_id_pk;
# PRIMARY KEY 삭제

ALTER TABLE employees
DROP CONSTRAINT fk_department;
# FOREIGN KEY 삭제

 


4. 제약조건 활용

 

4-1. 개체 무결성

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

# Primary Key : 각 제품은 고유 상품ID를 가져야 함

 

 

4-2. 참조 무결성

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

# Foreign Key : 주문은 반드시 존재하는 고객을 참조해야 함

 

 

4-3. 도메인 무결성 

CREATE TABLE accounts (
    account_id INT PRIMARY KEY,
    balance DECIMAL(10, 2) CHECK (balance >= 0),
    account_type VARCHAR(50) DEFAULT 'Savings'
);
# CHECK : 잔액은 0 이상이어야 함
# DEFAULT : 기본값은 'Savings' 설정

 

 

4-4. 중복 방지

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    email VARCHAR(255) UNIQUE 
);

# UNIQUE : 이메일은 고유해야 함

 

 


5. 제약조건 사용 시 주의사항

 

5-1. 제약조건의 우선순위

- Primary Key와 UNIQUE는 중복 데이터를 방지하며, CHECK와 DEFAULT는 데이터의 유효성을 검사한다.

 

5-2. 성능 고려

- 제약조건이 많아지면 INSERT와 UPDATE 작업의 성능이 저하될 수 있다.

 

5-3. Foreign Key와 참조 무결성

- 외부 키를 사용할 때 부모 테이블의 데이터를 삭제하려면, 자식 테이블의 데이터를 먼저 삭제해야 한다. (CASCADE 설정)

 

5-4. 제약조건 이름 지정

- 제약조건에 고유한 이름을 부여하면 관리와 디버깅이 용이하다.

 


6. 제약조건과 데이터 무결성 정리

 

무결성 유형 제약조건 설명
개체 무결성 PRIMARY KEY 각 행의 고유성을 보장
참조 무결성 FOREIGN KEY 테이블 간의 관계를 정확하게 유지
도메인 무결성 CHECK, DEFAULT 열 값의 유효성을 검사
사용자 정의 무결성 트리거, 저장 프로시저 비즈니스 로직에 따라 맞춤형 검증 수행

 

제약조건은 데이터의 정확성과 신뢰성을 유지하는 핵심 요소이다.

데이터 모델링 단계에서부터 무결성을 고려하여 제약조건을 설계하면, 안정적이고 신뢰할 수 있는 데이터베이스를 구축할 수 있다.

 

 

끝!

반응형