버그성 데이터만 골라서 지우기(쿼리)

wish17·2023년 5월 24일
0
post-thumbnail

지우려는 데이터

기존에 회원 삭제를 할 경우 회원의 이메일을 del_ + id + email 형태로 변경했었다.
이메일은 변경하지 않고 MemberStatus로만 삭제회원을 구분하기 위해 로직을 변경했고 기존에 del_로 시작하는 이메일을 갖는 회원 정보는 버그성 데이터가 되었다. 따라서 해당 데이터를 지우기 위해 아래와 같이 진행되었다.

지운 방법

  1. 멤버 삭제 시도(1회)
[입력 쿼리문]
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를 외래키로 갖고 있는 데이터는 모두 지워야 한다.

  1. 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이 정상적으로 지워졌다.

  1. 다시 멤버 삭제 시도(2회)
[입력 쿼리문]
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 테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.

  1. 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)
  1. 또 다시 멤버 삭제 시도(3회)
[입력 쿼리문]
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 테이블에서 참조하고 있다.

  1. 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 테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.

  1. 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)
  1. 다시 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 테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.

  1. 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)
  1. 또 다시 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를 참조하고 있어 삭제할 수 없다는 오류가 발생했다.

  1. 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)
  1. 또 또 다시 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 테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.

  1. 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)
  1. 또 또 또 다시 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 테이블에서 외래키로 참조하고 있어 삭제할 수 없다는 오류가 발생했다.

  1. 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)
  1. 드디어 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)
  1. member에서 이메일이 del_%인 데이터 삭제
[입력 쿼리문]
DELETE FROM member WHERE email LIKE 'del_%';

[출력]
Query OK, 10 rows affected (0.01 sec)

드디어 이메일이 del_로 시작하는 회원 데이터를 member 테이블에서 삭제했다.


느낀점

너무 무식한 방법으로 데이터를 지운 것 같다. 애초에 DB diagram을 다시보며 연관관계를 살피며 맨 끝단에서부터 지워나갔으면 조금 더 단순하게 지울 수 있었을 것 같다.
(처음에도 생각하기는 했지만 테스트용 계정이다보니 생성하지 않은 데이터가 있을까봐 최상단에서부터 시도하며 오류문 보고 해결한거긴 하다.)

내가 지운방법 그림(화살표)

또는 테이블 설정을 바꾸고 특정 데이터만 하드 delete하고 설정을 되돌리는게 나았을 것 같다.


Tip

현업에서는 애초에 이정도로 외래키를 많이 사용하도록 설계하지 않는다고 한다.
또한 보통 DB diagram을 보고 하나씩 조심해서 지우는게 일반적인 방법이라고 한다.
(이에 대해서 이후에 알아보고 정리한 DB 설계: 외래키와 CascadeType의 활용 참고)

0개의 댓글