무결성(integrity)에 대해 얘기한 적이 있습니다. 여러가지 제한을 통해 믿을만한 데이터로 유지되는 상태를 말합니다.
오늘은 참조 무결성(Referential Integrity)에 대해 살펴 봅니다. 데이터베이스라는 것이 하나의 테이블로만 구성된 경우가 거의 없고 여러 개의 테이블로 이루어져 있는 만큼 각가의 테이블 간의 관계를 고려하여 무결성을 유지하기 위한 여러 규칙들에 대해 살펴보는 단원입니다.
- Referential Intergrity
참조 무결성(Referential Integrity)을 줄여서 RI라고 흔히 칭합니다.
참조 무결성을 제대로 이해하자면 다음과 같은 개념들을 알고 있어야 합니다.
Dependent Table, Parent Table, Foreign Key, Primary Key
이미 앞에서 다 설명을 한 내용이지만, Dependent Table은 Foreign Key를 가지고 있는 테이블입니다. 반대로 Dependent Table의 Foreign Key에 대응하는 Primary Key를 가지고 있는 테이블은 Parent Table이 됩니다.왜 다시 Parent 테이블과 Dependent 테이블을 언급하냐면, 참조 무결성은 바로 Parent 테이블과 Dependent 테이블 간의 데이터 참조를 위한 규칙이기 때문입니다. 즉 서로 참조하고 있는 두 개의 테이블이 적절한 데이터를 유지할 수 있도록 몇 가지 제한을 가해 데이터들이 무결성을 유지하도록 하는 것이 바로 참조 무결성의 목적이니까요.
참조 무결성을 보장하려면 다음과 같은 세 가지 규칙이 있습니다.
- 데이터 삽입 규칙(Insertion Rule)
- 데이터 갱신 규칙(Update Rule)
- 데이터 삭제 규칙(Deletion Rule)
- Insertion Rule
Dependent 테이블에 Row(레코드)를 삽입할 때 적용되는 규칙인데,
- Foreign Key 컬럼의 값은 Parent Table의 Primary Key값 중의 하나이어야 합니다.
- 다만 Foreign Key 컬럼의 Column Rule이 NN(No Null)이 아닌 경우에는 Null값이 올 수도 있습니다.
다음 그림을 보죠.

EMPLOYEE라는 Dependent 테이블에 Row(레코드)를 삽입하려고 할 때 노란 색으로 표시된 Foreign Key 컬럼의 값이 DEPARTMENT 테이블에서 사용되는 값(1∼4) 중의 하나여야 한다는 것입니다.
따라서 그림에서와 같이 106 Tiger Wodds 4는 가능하지만, 107 Bill Gates 5는 불가능 합니다. 무엇때문에? 바로 5 때문에… - Update Rule
업데이트 룰은 Insertion Rule과 동일합니다.
아래 그림을 보시면,
Insertion 룰을 설명할 때와 같은 이유로 103 Eddy 2를 103 Eddy 5로 바꿀 수는 없습니다. - Deletion Rule
위의 Insertion Rule과 Update Rule이 Dependent 테이블에 해당되는 규칙이었다면 Deletion Rule은 Parent 테이블에 해당되는 내용입니다.
Insert와 Update에 비해 삭제는 매우 위험한 작업일 수 있어 규칙이 조금은 더 복잡합니다.
Dependent 테이블에서 Foreign Key 값으로 있지 않은 Primary Key 값은 당연히 언제든지 삭제할 수 있습니다. 그러나 Dependent 테이블에서 Foreign Key 값으로 참조하고 있는 Row(레코드)를 삭제하려 할 때는 다음 3가지 중 하나의 Rule을 적용할 수 있습니다.- 삭제 제한(Restricted Delete Rule)
말 그대로 삭제할 수 없습니다. Dependent 테이블에서 참조하고 있는 값이 있으면 Row(레코드)를 삭제할 수 없습니다. 우리가 나중에 실습할 오라클에서 기본적으로 제공하고 있는 삭제 규칙입니다.
위의 그림에서 보자면 노란 색으로 표시한 Row는 삭제할 수 있습니다. 왜냐하면 Depart Number 3은 EMPLOYEE 테이블의 Depalrtment Number에서 사용하지 않는 값이기 때문입니다. 그러나 그 아래 줄 4 Sales를 삭제할 수는 없습니다. EMPLOYEE 테이블에서 참조하고 있기 때문입니다. - Null 값 대체(Set Null Delete Rule)
Parent 테이블에서 삭제한 값을 Dependent 테이블에서 참조하고 있을 때 Not Null이 아닌 경우에는 그 값을 null로 바꿔줍니다. 오라클에서 제공하지 않는 규칙입니다.
위의 그림에서 보자면 노란 색으로 표시된 Row를 삭제하면 EMPLOYEE 테이블에서 삭제한 부분을 참조하고 있는 ROW의 Department Number 값이 Null 값으로 대체됩니다.(즉 값이 없어집니다.) - 계층적 삭제(Cascading Delete Rule)
Parent 테이블의 Row를 삭제하면서 관련 있는 Dependent 테이블의 Row도 모두 삭제합니다. 오라클에서 적용 가능한 규칙입니다.
위의 그림에서 보자면 노란 색으로 표시된 Row를 삭제하면 EMPLOYEE 테이블에서 삭제한 Row를 참조하고 있는 Row 전체가 삭제됩니다. 따라서 기존의 5개의 Row가 3개로 줄어들게 되죠.
- 삭제 제한(Restricted Delete Rule)
조금 복잡하기는 하지만 그리 어려운 내용은 아니었을 것입니다.
이상 동주아빠 손병목이었습니다.
