업무를 진행하다보면 가끔씩 데이터 클린징을 하는 경우가 생기는데 데이터를 업데이트를 할 경우 무결성 에러가 발생한다.
RDB(관계형 데이터베이스)에서 데이터 무결성이 위반되는 경우는 도메인 무결성(Domain Integrity), 엔터티 무결성(Entity Integrity), 참조 무결성(Referential Integrity), 업무 규칙 무결성(Business Rule Integrity) 위반으로 나눌 수 있음
컬럼의 데이터 타입, 길이, 허용 값 등의 제한을 어기는 경우 발생
예제 1: 잘못된 데이터 타입 입력
CREATE TABLE Users (
user_id INT PRIMARY KEY,
age INT CHECK (age >= 0) -- 나이는 음수가 될 수 없음
);
INSERT INTO Users (user_id, age) VALUES (1, -5); -- ❌ 나이는 음수일 수 없음
예제 2: 허용되지 않은 값 입력
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
order_status VARCHAR(10) CHECK (order_status IN ('Pending', 'Shipped', 'Delivered'))
);
INSERT INTO Orders (order_id, order_status) VALUES (101, 'Canceled'); -- ❌ 정의된 값 외의 데이터 입력
기본 키(Primary Key)가 중복되거나 NULL이 입력될 때 발생
예제 3: 기본 키 중복
CREATE TABLE Employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO Employees (emp_id, name) VALUES (1, 'Alice');
INSERT INTO Employees (emp_id, name) VALUES (1, 'Bob'); -- ❌ 기본 키 중복 오류 발생
예제 4: 기본 키에 NULL 값 입력
INSERT INTO Employees (emp_id, name) VALUES (NULL, 'Charlie'); -- ❌ 기본 키는 NULL 허용 안 됨
외래 키(Foreign Key) 값이 부모 테이블의 기본 키와 일치하지 않을 때 발생
예제 5: 존재하지 않는 외래 키 값 삽입
CREATE TABLE Departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE Employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES Departments(dept_id)
);
INSERT INTO Employees (emp_id, name, dept_id) VALUES (1, 'Alice', 100); -- ❌ 100번 부서가 없음
예제 6: 부모 테이블 삭제 시 오류 발생
DELETE FROM Departments WHERE dept_id = 1; -- ❌ Employees 테이블에서 dept_id=1을 참조하고 있으면 삭제 불가
(이 경우 ON DELETE CASCADE 옵션을 사용하면 해결 가능)
비즈니스 로직에 맞지 않는 데이터가 입력될 때 발생
예제 7: 중복 예약 금지
CREATE TABLE RoomBookings (
booking_id INT PRIMARY KEY,
room_no INT,
booking_date DATE,
UNIQUE (room_no, booking_date) -- 같은 날짜에 같은 방은 한 번만 예약 가능
);
INSERT INTO RoomBookings (booking_id, room_no, booking_date) VALUES (1, 101, '2025-02-10');
INSERT INTO RoomBookings (booking_id, room_no, booking_date) VALUES (2, 101, '2025-02-10'); -- ❌ 같은 방, 같은 날짜 예약 불가
예제 8: 계좌 잔액 부족한 출금
CREATE TABLE Accounts (
account_id INT PRIMARY KEY,
balance DECIMAL(10,2) CHECK (balance >= 0) -- 잔액은 0 이상이어야 함
);
UPDATE Accounts SET balance = balance - 100 WHERE account_id = 1; -- ❌ 잔액이 부족하면 위반