데이타베이스/SQL

데이터베이스 무결성을 유지하는 주요 제약 조건: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL

shimdh 2025. 1. 29. 14:20
728x90

PRIMARY KEY: 고유 식별자

정의

PRIMARY KEY는 테이블 내에서 각 행(row)을 고유하게 식별하는 데 사용됩니다. PRIMARY KEY는 NULL 값을 허용하지 않으며, 모든 값이 고유해야 합니다. 테이블의 기본 식별자 역할을 하며, 데이터 검색과 참조 무결성 유지에 필수적입니다.

사용 예시

학생 정보를 저장하는 students 테이블에서 student_id 필드를 PRIMARY KEY로 설정합니다:

CREATE TABLE students (
    student_id INT NOT NULL,
    name VARCHAR(50),
    age INT,
    PRIMARY KEY (student_id)
);

이 설정은 각 학생을 고유하게 식별하며, 데이터 중복을 방지합니다.

복합 키

두 개 이상의 열을 결합해 고유한 식별자를 생성하는 복합 PRIMARY KEY는 다대다 관계를 관리할 때 유용합니다. 예를 들어:

CREATE TABLE grades (
    student_id INT NOT NULL,
    subject VARCHAR(50) NOT NULL,
    grade CHAR(1),
    PRIMARY KEY (student_id, subject)
);

동일한 학생이 같은 과목에 대해 여러 성적을 가질 수 없도록 보장합니다.


FOREIGN KEY: 테이블 간 관계 정의

정의

FOREIGN KEY는 한 테이블의 열이 다른 테이블의 PRIMARY KEY를 참조하도록 설정하여 테이블 간의 관계를 정의합니다. FOREIGN KEY는 참조 무결성을 유지하며 데이터의 일관성을 보장합니다.

사용 예시

고객과 주문 정보를 관리하는 테이블:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

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

이 설정은 존재하지 않는 고객에 대한 주문을 방지합니다.

ON DELETE 및 ON UPDATE

FOREIGN KEY는 데이터 변경 시 동작 방식을 정의하는 옵션을 지원합니다:

  • ON DELETE CASCADE: 부모 데이터 삭제 시 관련 자식 데이터도 삭제됩니다.
  • ON UPDATE CASCADE: 부모 데이터 수정 시 자식 데이터가 자동으로 업데이트됩니다.

예시:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
);

UNIQUE: 고유한 데이터 보장

정의

UNIQUE 제약 조건은 특정 열 또는 열 조합의 값이 테이블 내에서 고유하도록 보장합니다. UNIQUE는 PRIMARY KEY와 유사하지만 NULL 값을 허용한다는 점에서 차이가 있습니다.

사용 예시

사용자 이메일이 중복되지 않도록 설정:

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

다중 열 UNIQUE

두 열의 조합이 고유해야 하는 경우:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    UNIQUE (product_id, customer_id)
);

이 설정은 동일한 고객이 같은 제품을 여러 번 주문하는 것을 방지합니다.


CHECK: 유효성 검사

정의

CHECK 제약 조건은 특정 열이 정의된 조건을 충족해야 한다는 규칙을 강제합니다. 이를 통해 잘못된 데이터를 방지하고 데이터의 유효성을 보장합니다.

사용 예시

학생 나이가 0 이상이어야 한다는 조건:

CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    CONSTRAINT chk_age CHECK (age >= 0)
);

복잡한 조건

논리적 조건을 포함한 복합 유효성 검사:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    salary DECIMAL(10,2),
    hire_date DATE,
    CONSTRAINT chk_salary_hiredate CHECK (salary > 0 AND hire_date <= CURRENT_DATE)
);

NOT NULL: 필수 데이터 강제

정의

NOT NULL 제약 조건은 특정 열에 NULL 값을 허용하지 않아 필수 데이터 입력을 강제합니다.

사용 예시

이메일이 반드시 입력되어야 하는 경우:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
);

기존 테이블에 적용

NOT NULL 제약 조건을 기존 열에 추가하려면 다음과 같이 설정합니다:

ALTER TABLE employees 
MODIFY COLUMN email VARCHAR(100) NOT NULL;

결론

제약 조건은 데이터베이스 무결성을 유지하고 효율적인 데이터 관리를 가능하게 하는 핵심 도구입니다. PRIMARY KEY는 데이터의 고유성을 보장하고, FOREIGN KEY는 테이블 간 관계를 정의하며, UNIQUE는 데이터 중복을 방지합니다. CHECK는 데이터의 유효성을 검사하고, NOT NULL은 필수 데이터를 강제합니다.

이러한 제약 조건들을 적절히 활용하면 데이터베이스의 안정성과 신뢰성을 높일 수 있습니다. 데이터베이스 설계 시 신중하게 제약 조건을 설정하면 비즈니스 요구사항을 충족시키고, 장기적인 성공을 보장할 수 있습니다.

728x90