코딩기록

[MySQL] 테이블에 ON DELETE CASCADE 설정하기 본문

백엔드/DB

[MySQL] 테이블에 ON DELETE CASCADE 설정하기

빌럽스 2024. 1. 13. 18:52

운동레슨예약 사이트의 회원 탈퇴 기능 구현 중 USER 데이터 삭제가 안되는 문제가 발생했다.

다른 테이블에서 USER 테이블을 FOREIGN KEY로 참조하고 있기 때문이었다.

 

부모 데이터 삭제 시 자식 데이터를 삭제해주는 ON DELETE CASCADE 설정을 했다. 

 

다음과 같이 만들어진 테이블의 foreign key constraints를 변경할 수 있다.

 

1. 기존의 foreign key를 지운다

// 기존의 foreign key 지우는 방법
ALTER TABLE table_name DROP FOREIGN KEY foreign_key_symbol

// 실제 사용 예제
alter table certificatel
drop foreign key FKn3ngph1sb2mhouaacn7xy5v29;

 

2. ON DELETE CASCADE를 포함한 foreign key를 재생성한다.

// ON DELETE CASCADE 포함한 foreign key 재생성
// 괄호가 있는 경우 괄호를 꼭 사용해야 합니다.
ALTER TABLE 자식_table_name 
ADD FOREIGN KEY (foreign_key_연결받을_자식_테이블의_column_name) 
REFERENCES 부모_table_name (foreign_key_로_가져올_column_name)
ON DELETE CASCADE;

// 실제 사용 예제
alter table certificate
add foreign key (userId)
references user (id)
on delete cascade;

 

 

ON DELETE CASCADE 적용된 DLL

 

  다만, 실제 서비스에서는 이처럼 ON DELETE CASCADE를 설정하여 회원이 탈퇴를 할 때 자식 데이터(게시글, 댓글, 알람)까지 삭제하는 것은 부적절하다고 생각한다. 만들어진 데이터들은 해당 탈퇴회원뿐만 아니라 다른 많은 데이터들과도 상호 관계를 가지기 때문이다.

 

※ 삭제되는 데이터 외의 다른 연관관계가 있어 남겨둘 필요가 있는 테이블의 데이터라면 ON DELETE SET NULL 을 사용하면 될 것 같다. 이러면 자식 테이블의 참조 컬럼값은 null이 된다.

 

출처: https://velog.io/@eensungkim/ON-DELETE-CASCADE-feat.-row-%ED%95%9C-%EB%B2%88%EC%97%90-%EC%A7%80%EC%9A%B0%EB%8A%94-%EB%B0%A9%EB%B2%95-TIL-78%EC%9D%BC%EC%B0%A8