SQL에서의 데이터 무결성 에러

canyi·2025년 2월 7일
0

mysql  m1

목록 보기
5/5

업무를 진행하다보면 가끔씩 데이터 클린징을 하는 경우가 생기는데 데이터를 업데이트를 할 경우 무결성 에러가 발생한다.

RDB(관계형 데이터베이스)에서 데이터 무결성이 위반되는 경우는 도메인 무결성(Domain Integrity), 엔터티 무결성(Entity Integrity), 참조 무결성(Referential Integrity), 업무 규칙 무결성(Business Rule Integrity) 위반으로 나눌 수 있음

1. 도메인 무결성(Domain 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'); -- ❌ 정의된 값 외의 데이터 입력

2. 엔터티 무결성(Entity Integrity) 위반

기본 키(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 허용 안 됨

3. 참조 무결성(Referential Integrity) 위반

외래 키(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 옵션을 사용하면 해결 가능)

4. 업무 규칙 무결성(Business Rule Integrity) 위반

비즈니스 로직에 맞지 않는 데이터가 입력될 때 발생

예제 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; -- ❌ 잔액이 부족하면 위반
profile
백엔드 개발 정리

0개의 댓글