YS's develop story
참조 무결성 및 Cascade 본문
참조 무결성 (Referential Integrity)이란 무엇인가?
참조 무결성은 관계형 데이터베이스 모델에서 2개의 관련 있는 관계 변수 간의 일관성을 말합니다
'주어진 속성 집합에 대해 한 관계에 나타나는 값이 다른 관계에서 특정 속성 집합에 대해서도 나타나도록
보장해야 한다'라고 데이터베이스 교재에 나와 있네요.
즉 참조 무결성이란 기본키와 참조 키 간의 관계가 항상 유지되도록 보장하는 것을 말합니다.
간단하게 설명하자면 교원 테이블의 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옵션이 적용되어 참조 무결성이 깨지는 명령을 실행하더라도
참조 무결성이 깨지지 않도록 자동으로 값을 생성하거나 삭제하도록 도와줍니다.
위와 같이 왼쪽에 있는 부서 테이블의 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값으로
변경됩니다.
'Database' 카테고리의 다른 글
Select절에서 사용할 수 있는 서브쿼리 Scalar Subquery (0) | 2021.04.29 |
---|---|
SQL Having, Where 차이 (0) | 2021.04.28 |
SQL Aggregate Functions 집계함수, Group By 활용 (0) | 2021.04.27 |
Cartesian Product (0) | 2021.04.26 |
Super key, Candidate key, Primary key, Foreign key 비교 (3) | 2021.04.25 |