FOREIGN KEY 제약 조건으로 참조 무결성 적용

개요

오라클 데이터베이스에서 데이터의 무결성을 유지하는 것은 매우 중요합니다. 특히 테이블 간의 관계를 정의하고 관리하는 것은 데이터의 일관성을 유지하는 데 핵심적인 역할을 합니다. FOREIGN KEY 제약 조건은 이러한 참조 무결성을 확보하기 위한 강력한 도구입니다. 본 글에서는 오라클 데이터베이스에서 FOREIGN KEY 제약 조건을 설정하고 사용하는 방법, 그리고 실제적인 예시를 통해 참조 무결성을 어떻게 확보할 수 있는지 상세하게 설명합니다.

FOREIGN KEY 제약 조건이란?

FOREIGN KEY(외래 키)는 한 테이블의 컬럼이 다른 테이블의 PRIMARY KEY(기본 키) 또는 UNIQUE KEY(고유 키)를 참조하는 경우에 사용됩니다. 이를 통해 테이블 간의 관계를 정의하고, 참조되는 테이블에 없는 값을 외래 키 컬럼에 삽입하는 것을 방지합니다. 즉, 데이터베이스 내의 데이터가 항상 일관성을 유지하도록 강제하는 역할을 합니다.

FOREIGN KEY 제약 조건 생성 및 설정 방법

FOREIGN KEY 제약 조건은 CREATE TABLE 또는 ALTER TABLE 문을 사용하여 생성할 수 있습니다. 각 방법에 대한 예시와 함께 상세한 설정 방법을 알아보겠습니다.

CREATE TABLE 문을 이용한 FOREIGN KEY 제약 조건 생성

테이블을 생성할 때 FOREIGN KEY 제약 조건을 함께 정의하는 방법입니다.

CREATE TABLE employees (    employee_id NUMBER PRIMARY KEY,    department_id NUMBER,    employee_name VARCHAR2(50),    CONSTRAINT fk_dept    FOREIGN KEY (department_id)    REFERENCES departments(department_id)    );

위 예시에서는 `employees` 테이블의 `department_id` 컬럼이 `departments` 테이블의 `department_id` 컬럼을 참조하도록 FOREIGN KEY 제약 조건 `fk_dept`를 정의했습니다. `department_id` 컬럼은 `departments` 테이블에 존재하는 값만 가질 수 있습니다.

ALTER TABLE 문을 이용한 FOREIGN KEY 제약 조건 추가

이미 존재하는 테이블에 FOREIGN KEY 제약 조건을 추가하는 방법입니다.

ALTER TABLE employeesADD CONSTRAINT fk_dept    FOREIGN KEY (department_id)    REFERENCES departments(department_id);

위 예시에서는 `employees` 테이블에 `department_id` 컬럼을 외래 키로 지정하고, `departments` 테이블의 `department_id` 컬럼을 참조하도록 FOREIGN KEY 제약 조건 `fk_dept`를 추가했습니다.

ON DELETE 옵션

참조되는 테이블(부모 테이블)에서 행이 삭제될 때, 참조하는 테이블(자식 테이블)의 외래 키에 대한 동작을 정의하는 옵션입니다. ON DELETE 옵션은 참조 무결성을 유지하기 위해 중요한 역할을 합니다. 다음은 ON DELETE 옵션의 종류입니다.

  • CASCADE: 부모 테이블의 행이 삭제되면, 자식 테이블에서 해당 행을 참조하는 모든 행도 함께 삭제됩니다.
  • SET NULL: 부모 테이블의 행이 삭제되면, 자식 테이블에서 해당 행을 참조하는 외래 키 값이 NULL로 설정됩니다. 이 옵션을 사용하려면 자식 테이블의 외래 키 컬럼이 NULL 값을 허용해야 합니다.
  • SET DEFAULT: 부모 테이블의 행이 삭제되면, 자식 테이블에서 해당 행을 참조하는 외래 키 값이 DEFAULT 값으로 설정됩니다. 이 옵션을 사용하려면 자식 테이블의 외래 키 컬럼에 DEFAULT 값이 정의되어 있어야 합니다.
  • NO ACTION (또는 RESTRICT): 부모 테이블의 행을 삭제하려고 할 때, 자식 테이블에서 해당 행을 참조하는 외래 키가 존재하면 삭제 작업이 실패합니다. (기본 동작)

ON DELETE CASCADE 예시

부모 테이블에서 행이 삭제될 때, 자식 테이블의 참조 행도 함께 삭제하는 설정입니다.

CREATE TABLE departments (    department_id NUMBER PRIMARY KEY,    department_name VARCHAR2(50)    );CREATE TABLE employees (    employee_id NUMBER PRIMARY KEY,    department_id NUMBER,    employee_name VARCHAR2(50),    CONSTRAINT fk_dept    FOREIGN KEY (department_id)    REFERENCES departments(department_id)    ON DELETE CASCADE    );

`departments` 테이블에서 특정 `department_id`를 가진 부서가 삭제되면, 해당 `department_id`를 참조하는 `employees` 테이블의 모든 직원 정보도 함께 삭제됩니다.

ON DELETE SET NULL 예시

부모 테이블에서 행이 삭제될 때, 자식 테이블의 외래 키 값을 NULL로 설정하는 설정입니다.

CREATE TABLE departments (    department_id NUMBER PRIMARY KEY,    department_name VARCHAR2(50)    );CREATE TABLE employees (    employee_id NUMBER PRIMARY KEY,    department_id NUMBER NULL,    employee_name VARCHAR2(50),    CONSTRAINT fk_dept    FOREIGN KEY (department_id)    REFERENCES departments(department_id)    ON DELETE SET NULL    );

`departments` 테이블에서 특정 `department_id`를 가진 부서가 삭제되면, 해당 `department_id`를 참조하는 `employees` 테이블의 해당 직원 정보의 `department_id` 컬럼은 NULL로 설정됩니다.

ON DELETE NO ACTION 예시

부모 테이블에서 행을 삭제하려고 할 때, 자식 테이블에서 해당 행을 참조하는 외래 키가 존재하면 삭제 작업을 막는 설정입니다. 이것이 기본 설정입니다.

CREATE TABLE departments (    department_id NUMBER PRIMARY KEY,    department_name VARCHAR2(50)    );CREATE TABLE employees (    employee_id NUMBER PRIMARY KEY,    department_id NUMBER,    employee_name VARCHAR2(50),    CONSTRAINT fk_dept    FOREIGN KEY (department_id)    REFERENCES departments(department_id)    ON DELETE NO ACTION    );

`departments` 테이블에서 특정 `department_id`를 가진 부서를 삭제하려고 할 때, 해당 `department_id`를 참조하는 `employees` 테이블의 직원 정보가 존재하면 삭제 작업이 실패하고 오류가 발생합니다.

참조 무결성 위반 시의 오류 처리

FOREIGN KEY 제약 조건에 의해 참조 무결성이 위반되면 오라클 데이터베이스는 ORA-02291 또는 ORA-02292 오류를 발생시킵니다.

  • ORA-02291: 무결성 제약 조건 위반 – 부모 키가 없습니다.: 자식 테이블에 부모 테이블에 존재하지 않는 외래 키 값을 삽입하려고 할 때 발생합니다.
  • ORA-02292: 무결성 제약 조건 위반 – 자식 레코드가 발견되었습니다.: 부모 테이블의 행을 삭제하려고 할 때, 해당 행을 참조하는 자식 테이블의 외래 키가 존재하면 발생합니다.

이러한 오류를 처리하기 위해 애플리케이션 레벨에서 예외 처리를 구현하거나, 데이터베이스 트리거를 사용하여 추가적인 무결성 검사를 수행할 수 있습니다.

실무 적용 예시

다음은 FOREIGN KEY 제약 조건을 실무에 적용하는 예시입니다. 쇼핑몰 데이터베이스를 예로 들어 주문 테이블과 고객 테이블 간의 관계를 정의해 보겠습니다.

CREATE TABLE customers (    customer_id NUMBER PRIMARY KEY,    customer_name VARCHAR2(50),    customer_email VARCHAR2(50) UNIQUE    );CREATE TABLE orders (    order_id NUMBER PRIMARY KEY,    customer_id NUMBER,    order_date DATE,    total_amount NUMBER(10, 2),    CONSTRAINT fk_customer    FOREIGN KEY (customer_id)    REFERENCES customers(customer_id)    ON DELETE CASCADE    );

위 예시에서는 `orders` 테이블의 `customer_id`가 `customers` 테이블의 `customer_id`를 참조하도록 설정했습니다. ON DELETE CASCADE 옵션을 사용하여 고객 정보가 삭제될 때, 해당 고객의 주문 정보도 함께 삭제되도록 설정했습니다.

주문 테이블에 고객 ID가 존재하는 주문만 입력될 수 있도록 보장하며, 고객 테이블에서 고객 정보가 삭제되면 관련 주문도 자동으로 삭제되어 데이터의 일관성을 유지합니다.

결론

오라클 데이터베이스에서 FOREIGN KEY 제약 조건을 이용하면 데이터의 무결성을 효율적으로 관리할 수 있습니다. FOREIGN KEY 제약 조건의 다양한 옵션(ON DELETE CASCADE, SET NULL 등)을 적절히 활용하여 데이터베이스의 일관성을 높이고, 애플리케이션의 안정성을 향상시킬 수 있습니다. 본 글에서 제시된 예시와 설정 방법을 통해 실제 데이터베이스 설계 시 참조 무결성을 효과적으로 구현할 수 있습니다.

위로 스크롤