MySQL Error Code: 1452. Cannot add or update a child row 해결
상황

tbl_group_member 테이블은 tbl_group 테이블과 tbl_member 테이블을 각각 fk를 통해 참조하고 있다.

기존의 데이터셋을 로컬 DB 상에 옮기기 위해 mysql workbench로 insert into ~ 구문을 tbl_group_member에 시도하였지만 위와 같은 에러가 발생했다.
해결
tbl_group_member은 tbl_group과 tbl_member의 idx를 각각 fk(gidx, midx)로 가진다. (N:M 관계를 연결하는 테이블)
이때 tbl_group_member에 새 row를 추가하기 위해서는 tbl_group_member가 참조하는 컬럼과 fk의 값은 항상 일치해야 한다(참조 무결성)
즉, tbl_group의 idx 컬럼에 포함되어 있지 않은 값이 tbl_group_member의 gidx에 있어서는 안된다. (tbl_member의 경우도 마찬가지)
→ 따라서 insert하려는 값(row)들 중 ‘midx ≠ tbl_member의 idx’ 이거나 ‘gidx ≠ tbl_group의 idx’인 값들을 제거한 후 insert해주면 된다.
내가 insert하려는 값들은 총 3000개 이상이라 이를 일일이 찾아서 제거하는 것은 불가능하므로, 다음과 같이 mysql 쿼리문을 사용하여 해결하였다.
1. tbl_group_member 테이블과 동일한 컬럼 구조를 가진 test 테이블을 생성한다. (fk 설정 없이 컬럼 구조만 동일)
create table `test` like `tbl_group_member`;
2. test 테이블에 ‘insert하려는 값들’을 넣는다.
INSERT INTO `test` (`idx`, `gidx`, `midx`, ~, ~, ... ) VALUES
(~, ~, ...),
(~, ~, ...),
...
(~, ~, ...);
3. test 테이블에서 ‘midx ≠ tbl_member의 idx’ 이거나 ‘gidx ≠ tbl_group’인 값들을 제거한 후, 값들을 다시 tbl_group_member 테이블에 복사한다.
delete from test where midx not in (select idx from tbl_member);
delete from test where gidx not in (select idx from tbl_group);
insert into `tbl_group_member` select * from `test`;

이제 tbl_group_member 테이블에 값들이 성공적으로 옮겨졌다.
'TIL > Database' 카테고리의 다른 글
uuid vs auto increment PK 어떤걸 사용하는게 옳을까? <TIL_2022_08_11> (0) | 2022.08.11 |
---|