YS's develop story

참조 무결성 및 Cascade 본문

Database

참조 무결성 및 Cascade

Yusang 2021. 5. 18. 08:56

참조 무결성 (Referential Integrity)이란 무엇인가?

참조 무결성은 관계형 데이터베이스 모델에서 2개의 관련 있는 관계 변수 간의 일관성을 말합니다

 

'주어진 속성 집합에 대해 한 관계에 나타나는 값이 다른 관계에서 특정 속성 집합에 대해서도 나타나도록

보장해야 한다'라고 데이터베이스 교재에 나와 있네요.

 

즉 참조 무결성이란 기본키와 참조 키 간의 관계가 항상 유지되도록 보장하는 것을 말합니다.

 

 

 

(좌)Department, (우)Professor 테이블

간단하게 설명하자면 교원 테이블의 departmentName이 Foreign key이고 그 값이 'Biology'이면

실제로 학과 테이블에 'Biology'가 있어야 합니다. 그리고 두 값은 항상 같아야 합니다.

이러한 관계가 유지되도록 하는 것을 참조 무결성이라고 합니다.

 

 

 

위와 같은 튜플을 추가하려고 하는 경우 에러가 발생하면서 추가할 수 없습니다.

참조 무결성이 지켜지지 않았기 때문입니다.

 

 

 

만약 학과 테이블에서 위와 같이 Biology라는 값을 삭제하고자 하는 경우 또는 이름을 바꾸고자 하는 경우

이를 참조하고 있는 값 Foreign Key가 존재할 때, DBMS는 아래와 같이 이를 강제로 막습니다.

그 이유는 Biology라는 값이 삭제되거나 변경되는 경우 참조 무결성이 깨지기 때문이죠.

 

 

 

그럼 만약 Biology라는 학과 이름을 변경해야 하거나 삭제해야 하는 상황에서는 어떻게 해야 할까요?
Biology를 참조하고 있는 튜플들을 모두 삭제하고 이름을 변경할 수는 없을 텐데 말이죠

 

그래서 이때 Casecade Action을 사용하게 됩니다.

 

Cascade란?

참조 무결성 제약 조건이 깨지는 명령을 실행할 경우 일반적으로 명령을 거부하지만

Cascading 옵션을 통해 참조 무결성이 깨지는 것을 허용하면서 관련된 모든 값을 업데이트하거나 삭제할 수 있도록 할 수 있습니다.

 

 

이미 생성된 테이블에는 어떻게 적용하는가...?

ALTER TABLE Professor ADD CONSTRAINT FOREIGN KEY (departmentName)
        REFERENCES Department (departmentName) ON DELETE CASCADE ON UPDATE CASCADE;

이미 생성된 데이터베이스 테이블에는 위와 같은 SQL문을 적용해 줍시다.

 

 

그럼 이제 테이블에 Cascade옵션이 적용되어 참조 무결성이 깨지는 명령을 실행하더라도 

참조 무결성이 깨지지 않도록 자동으로 값을 생성하거나 삭제하도록 도와줍니다.

 

 

(좌)Department, (우)Professor 테이블

위와 같이 왼쪽에 있는 부서 테이블의 departmentName을 바꾸면 이를 참조하고 있는

Foreign Key가 모두 같게 바뀌게 됩니다.

 

만약 바꾼 TechBiology를 삭제한다면 이를 참조하고 있는 교원 테이블에 departmentName이

TechBiology인 튜플도 삭제되게 됩니다.

 

 

 

ALTER TABLE Professor ADD CONSTRAINT FOREIGN KEY (departmentName)
        REFERENCES Department (departmentName) ON DELETE SET NULL ON UPDATE CASCADE;

만약 튜플이 삭제되는 것을 원하지 않는 다면 위와 같이 SQL문을 적용하면 됩니다.

SET NULL을 통해 참조하고 있는 Foreign Key가 삭제된다면 departmentName이 자동으로 null값으로

변경됩니다.

Comments