casCade 에 대해서 알아보자.
영어사전은 찾아보니, 작은폭포, 폭포처럼 물이 흐르다로 나온다.
모르는 단어가 있을 때 뜻먼저 찾아보는 것도 이해하는데 큰 도움이 주는 것 같다.
casCade 기능자체가 foreign key가 걸린 '연관 데이터'를 삭제할 수 있게 하는 기능이다.
쉽게 말해 다른 두 테이블의 데이터가 A ← B 이런식으로 B가 A를 참조하고 있을 때,
A를 삭제하면 폭포마냥 B까지 콸콸콸 삭제 해 버리는 기능이다.
직접 한번 테이블을 만들어 구현해보자.
TEST 준비
위 사진처럼
테이블을 3개 준비했다. 최상위 company 테이블의 첫번째 행 '구글' 이라는 데이터를 삭제 예정이다.
'구글' 이라는 행 삭제시 하위 테이블의 org1 / org2 데이터가 삭제 되야 되며,
org1 / org2 데이터 삭제시 이를 참조하고 있는 최하위 테이블의 ID 1,2,6번 값이 삭제 되어야 한다.
* 최상위(1) company
* 차상위(2) organization
* 최하위(3) region
커멘드
ALTER TABLE `organazation`
ADD CONSTRAINT `FK_organazation_company`
FOREIGN KEY (`company_code`)
REFERENCES `company` (`code`)
ON UPDATE NO ACTION ON DELETE CASCADE;
* (2)번째 차상위 테이블에 company_code 컬럼에 FK_key를 걸었다. → (1)번째 company 최상위 테이블의 code 컬럼 값을 참조하도록...
테이블 만들때는 CREATE TABLE ~~~ 로 시작 하면 된다.
DML과 친해지는 습관을 들이도록 하자.
참조
최하위(3) region 테이블의 organization_orgcode 데이터는 → 차상위(2) organization 테이블의 orgCode 값을 참조하고 있다.
차상위(2) organization 테이블의 company_code는 → 최상위(1) company 테이블의 code 값을 참조하고 있다.
3 → 2 → 1 순으로 참조하고 있기 때문에, 만약 casCade 를 걸지 않은 상태로 최상위 데이터 1번데이터를 삭제시,
DB는 ERROR 메세지를 반환하게 된다.
* ERROR : Cannot delete or update a parent row: a foreign key constraint fails
이경우 2가지 방법이 있는데 첫번째로, 최하위(3) 테이블의 데이터 부터 3 → 2 → 1 테이블 순으로 참조키를 확인하며
걸려있는 데이터를 역순으로 삭제 처리 하도록 한다. 위 그림으로 치면, region(3) 테이블의 1 / 2 / 6번 ID 값을 삭제
하고, organization 테이블의 org1 /org2 데이터를 삭제하고, 마지막 최상위 company 테이블의 ID 1번 값을 삭제해야
한다. casCade는 최상위 1번 데이터 삭제시 자동으로 하위 테이블의 모든 데이터를 자동 삭제 처리 시켜주는 기능이다.
두번째 방법은 걸려있는 foreign key를 해제하고 데이터를 삭제 한다. (참조 하던 데이터를 정확히 삭제 하지 못 할경우
쓰레기값이 남을 수 있고 데이터의 정합성이 떨어지게 된다. 비추천)
결과
최상위 company 테이블에서 '구글' 이라는 행 데이터를 삭제하였다.
삭제시 하위 테이블의 org1 / org2 데이터가 삭제 되야 되며,
org1 / org2 데이터 삭제시 이를 참조하고 있는 최하위 테이블의 ID 1,2,6번 값이 삭제 되어야 한다.
오늘 처음 CASCADE 기능에 대해 알게 되었고 정리를 해보았다.
관계형 데이터베이스에서 DB설계시 굉장히 유용하게 사용되지 않을까 싶고
알고있어야할 필수사항이라는 생각이 들었다.
끝.
본문 내용이 도움이 되셨다면, 아래의 공감버튼을 눌러주세요.
정보 공유를 위한 포스팅에 큰 힘이 됩니다.
만약 틀린 정보가 있으면 댓글 달아주세요. 수정하도록 하겠습니다.
읽어주셔서 감사합니다. 오늘도 좋은 하루 보내세요.
'DB' 카테고리의 다른 글
Deadlock found when trying to get lock; try restarting transaction (0) | 2022.01.07 |
---|---|
Cause: java.sql.SQLException: Disk full (0) | 2021.11.30 |
MySQL error 1040 "Too many connections" & Increase max connections 에러 해결 (0) | 2021.09.30 |
MySQL , MariaDB 쿼리 로그 보기 (0) | 2021.09.30 |
MySQL 접속 원리에 관한 고찰(feat. 프로젝트) (0) | 2021.09.29 |