기존에 회원 삭제를 할 경우 회원의 이메일을 del_
+ id
+ email
형태로 변경했었다.
이메일은 변경하지 않고 MemberStatus로만 삭제회원을 구분하기 위해 로직을 변경했고 기존에 del_
로 시작하는 이메일을 갖는 회원 정보는 버그성 데이터가 되었다. 따라서 해당 데이터를 지우기 위해 아래와 같이 진행되었다.
[입력 쿼리문]
DELETE FROM member WHERE email LIKE 'del_%';
[출력 (오류문)]
[23000][1451] Cannot delete or update a parent row: a foreign key constraint fails
(`EduSync`.`member_roles`, CONSTRAINT `fk_member_roles_member_id` FOREIGN KEY (`member_id`)
REFERENCES `member` (`id`))
회원 삭제를 시도했지만, member_roles
테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.
따라서 지우려는 목표인 회원의 member_id
를 외래키로 갖고 있는 데이터는 모두 지워야 한다.
member_roles
삭제[입력 쿼리문]
DELETE FROM member_roles WHERE member_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력]
Query OK, 10 rows affected (0.01 sec)
삭제하려는 member_id
를 참조하고 있는member_roles
이 정상적으로 지워졌다.
[입력 쿼리문]
DELETE FROM member WHERE email LIKE 'del_%';
[출력 (오류문)]
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
(`EduSync`.`studygroup_join`, CONSTRAINT `fk_studygroup_join_member_id` FOREIGN KEY (`member_id`)
REFERENCES `member` (`id`))
이번에는 studygroup_join
테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.
studygroup_join
삭제[입력 쿼리문]
DELETE FROM studygroup_join WHERE member_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력]
Query OK, 14 rows affected (0.02 sec)
[입력 쿼리문]
DELETE FROM member WHERE email LIKE 'del_%';
[출력 (오류문)]
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key
constraint fails (`EduSync`.`studygroup`, CONSTRAINT `fk_studygroup_leader_member_id`
FOREIGN KEY (`leader_member_id`) REFERENCES `member` (`id`))
이번에는 studygroup
테이블에서 참조하고 있다.
studygroup
삭제 시도[입력 쿼리문]
DELETE FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력 (오류문)]
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key
constraint fails (`EduSync`.`studygroup_join`, CONSTRAINT `fk_studygroup_join_studygroup_id`
FOREIGN KEY (`studygroup_id`) REFERENCES `studygroup` (`id`))
이번에는 studygroup_join
테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.
studygroup_join
에서 studygroup_id
삭제[입력 쿼리문]
DELETE FROM studygroup_join WHERE studygroup_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력]
Query OK, 5 rows affected (0.01 sec)
studygroup
삭제 시도[입력 쿼리문]
DELETE FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력 (오류문)]
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`EduSync`.`search_tag`, CONSTRAINT `fk_search_tag_studygroup_id` FOREIGN KEY (`studygroup_id`) REFERENCES `studygroup` (`id`))
이번에는 search_tag
테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.
search_tag
에서 studygroup_id
삭제[입력 쿼리문]
DELETE FROM search_tag WHERE studygroup_id IN (SELECT id FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%'));
[출력]
Query OK, 49 rows affected (0.01 sec)
studygroup
삭제 시도[입력 쿼리문]
mysql> DELETE FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력 (오류문)]
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`EduSync`.`time_schedule`, CONSTRAINT `fk_time_schedule_studygroup_id` FOREIGN KEY (`studygroup_id`) REFERENCES `studygroup` (`id`))
이번에는 time_schedule
테이블에서 studygroup_id
를 참조하고 있어 삭제할 수 없다는 오류가 발생했다.
time_schedule
에서 studygroup_id
삭제[입력 쿼리문]
DELETE FROM time_schedule WHERE studygroup_id IN (SELECT id FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%'));
[출력]
Query OK, 42 rows affected (0.01 sec)
studygroup
삭제 시도[입력 쿼리문]
DELETE FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력 (오류문)]
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`EduSync`.`studygroup_post_comment`, CONSTRAINT `fk_studygroup_post_comment_studygroup_id` FOREIGN KEY (`studygroup_id`) REFERENCES `studygroup` (`id`))
이번에는 studygroup_post_comment
테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.
studygroup_post_comment
에서 studygroup_id
삭제[입력 쿼리문]
DELETE FROM studygroup_post_comment WHERE studygroup_id IN (SELECT id FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%'));
[출력]
Query OK, 22 rows affected (0.01 sec)
studygroup
삭제 시도[입력 쿼리문]
DELETE FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력 (오류문)]
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`EduSync`.`studygroup_join`, CONSTRAINT `fk_studygroup_join_studygroup_id` FOREIGN KEY (`studygroup_id`) REFERENCES `studygroup` (`id`))
이번에는 studygroup_join
테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.
studygroup_join
에서 studygroup_id
삭제[입력 쿼리문]
DELETE FROM studygroup_join WHERE studygroup_id IN (SELECT id FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%'));
[출력]
Query OK, 4 rows affected (0.01 sec)
studygroup
삭제[입력 쿼리문]
DELETE FROM studygroup WHERE leader_member_id IN (SELECT id FROM member WHERE email LIKE 'del_%');
[출력]
Query OK, 14 rows affected (0.01 sec)
member
에서 이메일이 del_%
인 데이터 삭제[입력 쿼리문]
DELETE FROM member WHERE email LIKE 'del_%';
[출력]
Query OK, 10 rows affected (0.01 sec)
드디어 이메일이 del_
로 시작하는 회원 데이터를 member
테이블에서 삭제했다.
너무 무식한 방법으로 데이터를 지운 것 같다. 애초에 DB diagram을 다시보며 연관관계를 살피며 맨 끝단에서부터 지워나갔으면 조금 더 단순하게 지울 수 있었을 것 같다.
(처음에도 생각하기는 했지만 테스트용 계정이다보니 생성하지 않은 데이터가 있을까봐 최상단에서부터 시도하며 오류문 보고 해결한거긴 하다.)
또는 테이블 설정을 바꾸고 특정 데이터만 하드 delete하고 설정을 되돌리는게 나았을 것 같다.
현업에서는 애초에 이정도로 외래키를 많이 사용하도록 설계하지 않는다고 한다.
또한 보통 DB diagram을 보고 하나씩 조심해서 지우는게 일반적인 방법이라고 한다.
(이에 대해서 이후에 알아보고 정리한 DB 설계: 외래키와 CascadeType의 활용 참고)