내가 필요해서 내가 적는 블로그

JAVA 백엔드 개발자의 기록들

DB

MySQL cascade / on delete cascade EaSY!! (연관 데이터 삭제 처리)

돌프 2022. 1. 15. 00:40
반응형

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 ~~~ 로 시작 하면 된다. 

 

* 물론 필자는 또각또각 클릭 몇번 했다. 외래키 탭에서 +추가를 눌러서 화면 오른쪽에 열, 참조 테이블, 외래열, DELETE할때 CASCADE 설정. 

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번 값이 삭제 되어야 한다. 

* org1, org2 데이터가 잘 삭제 되었다. 

 

* org1, org2가 삭제됨으로 인하여, org1, org2를 참조하던 최하위 테이블의 데이터 ID 1, 2, 6 값을 가지던 데이터도 잘 삭제 되었다. 

 

 

오늘 처음 CASCADE 기능에 대해 알게 되었고 정리를 해보았다.

관계형 데이터베이스에서 DB설계시 굉장히 유용하게 사용되지 않을까 싶고

알고있어야할 필수사항이라는 생각이 들었다. 

 

 

 

 

끝.

 

 

 

 

본문 내용이 도움이 되셨다면, 아래의 공감버튼을 눌러주세요. 

정보 공유를 위한 포스팅에 큰 힘이 됩니다. 

만약 틀린 정보가 있으면 댓글 달아주세요. 수정하도록 하겠습니다. 

읽어주셔서 감사합니다. 오늘도 좋은 하루 보내세요. 

반응형