본문 바로가기

TIL/Database

mysql 1452 cannot add or update a child row ~ 에러 해결

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

상황

 

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

 

 

 

1452 error

기존의 데이터셋을 로컬 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 테이블에 값들이 성공적으로 옮겨졌다.