데이터베이스 참조 무결성
더 많은 작업
Referential Integrity
참조 무결성은 데이터베이스에서 외래 키(foreign key)가 다른 테이블의 주 키(primary key)와 일관되게 연결되어 있어야 함을 보장하는 규칙이다. 이는 데이터 간의 관계가 올바르게 형성되고, 데이터의 무결성을 유지하는 데 필수적인 요소이다.
- 참조 무결성은 데이터베이스의 데이터 간의 관계를 명확히 하여 데이터의 일관성을 유지하는 데 중요한 역할을 한다. 이를 통해 잘못된 데이터 입력이나 무결성 오류를 방지하고, 데이터의 신뢰성을 높일 수 있다.
외래 키는 한 테이블의 속성이 다른 테이블의 주 키를 참조하는 경우에 설정된다. 이를 통해 두 테이블 간의 관계를 정의하며, 외래 키는 반드시 참조하는 주 키가 존재해야 한다.
- 외래 키로 설정된 값은 반드시 참조하는 테이블의 주 키에 존재해야 한다. 즉, 외래 키가 NULL이 아닌 경우, 해당 값은 반드시 참조 테이블에 있어야 한다.
규칙을 준수하기 위한 제약조건은 아래 참고
Referential Integrity Constraint
예를 들어, 고객 테이블과 주문 테이블이 있다고 가정하자. 고객 테이블의 고객 ID가 주 키라면, 주문 테이블의 고객 ID는 외래 키로 설정될 수 있다. 이 경우, 주문 테이블의 고객 ID는 반드시 고객 테이블에 존재하는 고객 ID여야 하며, 고객이 삭제될 경우 해당 고객의 주문을 어떻게 처리할지를 정의해야 한다.
참조 무결성이 유지되기 위한 제약조건은 아래와 같이 4가지로 구분된다.
| 기능 | 구분 |
|---|---|
| Restrict |
|
| Cascade | 부모 테이블의 참조 대상 키가 삭제되면 자식 테이블의 참조 튜플 삭제 |
| Nullify | 부모 테이블의 참조 대상 키가 삭제되면 자식 테이블의 참조값을 Null로 변경 |
| Default | 부모 테이블의 참조 대상 키가 삭제되면 미리 정의한 Default 값으로 변경 |
직원(사번, 이름, 부서번호) 테이블의 부서번호가 부서(부서번호, 부서이름) 테이블의 기본키를 외래 키로 참조하고, 부서에 01·02·03 이 있으며 직원 230301 이 부서 03 을 참조한다고 하자.
| 연산 | 예 | 결과 |
|---|---|---|
| 참조하는(자식) 테이블에 INSERT | 직원에 (230304, D, 04) 추가. 부서에 04 가 없다 | 참조 무결성 위배. 기본키(사번)는 정상이라 개체 무결성과는 관계없다 |
| 참조하는(자식) 테이블에서 DELETE | 직원 (230101, A, 01) 삭제 | 위배 없음 |
| 참조되는(부모) 테이블에 INSERT | 부서에 (04, 정보통신과) 추가 | 위배 없음(기본키가 중복·NULL 이 아니므로) |
| 참조되는(부모) 테이블에서 DELETE | 부서 (03, 기획과) 삭제. 직원 230301 이 참조 중 | 참조 무결성 위배(RESTRICT 면 거부된다. CASCADE·SET NULL 로 정의했으면 자식 행이 함께 삭제되거나 NULL 이 된다) |
| 기본키가 NULL 이거나 중복인 행 INSERT | 부서에 (03, 총무과) 추가 | 개체 무결성 위배 → 데이터베이스 개체 무결성 |
외래 키를 정의할 때 부모 쪽 행이 삭제(ON DELETE)·변경(ON UPDATE)되면 자식 쪽을 어떻게 할지 지정한다.
| 옵션 | 동작 |
|---|---|
| CASCADE | 부모 행이 삭제되면 자식 행도 삭제, 부모 키가 바뀌면 자식의 외래 키도 같은 값으로 바뀐다 |
| SET NULL | 자식의 외래 키를 NULL 로 바꾼다. 외래 키가 NOT NULL 이면 쓸 수 없다 |
| SET DEFAULT | 자식의 외래 키를 열의 DEFAULT 값으로 바꾼다 |
| RESTRICT / NO ACTION | 자식 행이 참조하고 있으면 부모 행의 삭제·변경을 거부한다 |
CREATE TABLE 부서 (
...,
관리자번호 INT NOT NULL DEFAULT 1,
FOREIGN KEY (관리자번호) REFERENCES 직원(직원번호)
ON DELETE SET DEFAULT -- 관리자인 직원이 삭제되면 디폴트값으로
ON UPDATE CASCADE -- 직원번호가 바뀌면 관리자번호도 같이 변경
);
- 관리자번호가 NOT NULL 이므로 삭제 시 SET NULL 은 쓸 수 없고, 디폴트값으로 바꾸라는 요구에는 SET DEFAULT 가 맞다