본문 바로가기
Data/Database

[Oracle/MySQL] Foreign KEY 제약 조건을 위배하는 레코드(로우) 찾기 - Duplicate 중복 에러

by prinha 2021. 3. 24.
728x90
반응형

 

Oracle -> MySQL로 데이터 마이그레이션 중 다음과 같은 에러가 발생했다.

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

마이그레이션 순서가 테이블 생성 -> 데이터 insert -> PK, index, Foreign Key 생성 ..으로 이어지는데,

중복되는 데이터때문에 Foreign Key를 추가할 수 없다는 오류였다.

 

중복되는 레코드를 찾아서 삭제하려고하는데 데이터의 양이 많을 경우 하나 하나 찾기는 불가능하다.

 

그럴때에는 다음과 같이 left join을 이용하여 중복 레코드를 쉽게 찾을 수 있다.

// au_task - child, basic_user - parent

SELECT au_task.COMPANY_CODE, au_task.COMPANY_CODE
FROM au_task LEFT JOIN basic_user ON au_task.COMPANY_CODE = basic_user.COMPANY_CODE
WHERE basic_user.COMPANY_CODE IS NULL;

 

NOT IN, NOT EXISTS를 사용할 수 도 있다.

SELECT child_id, parent_id
FROM child
WHERE parent_id NOT IN (SELECT parent_id FROM parent);
 
SELECT child_id, parent_id
FROM child
WHERE NOT EXISTS (SELECT 1 FROM parent WHERE parent.parent_id = child.parent_id)

 

 

728x90
반응형