DEV WIKI
백엔드 · 오류·증상

Cannot add or update a child row: a foreign key constraint fails

MariaDB 또는 MySQL에서 오류 코드 1216과 함께 표시되는 외래 키 제약 조건 오류 메시지를 식별합니다.

빠른 답변

우선 확인할 원인
오류 코드 1216과 SQLSTATE 23000은 `Cannot add or update a child row: a foreign key constraint fails` 메시지에 해당합니다.
먼저 확인할 항목
현재 화면 또는 로그의 숫자 오류 코드가 `1216`인지 확인합니다.
적용 범위
현재 증상과 본문에 적은 관찰 조건이 함께 확인된 경우
출처 확인일
2026-07-29
최종 검토
2026-07-24
수정일
2026-07-27
오류·수정 제보 (새 창에서 열림)

현재 증상

  • 애플리케이션 오류 메시지

먼저 확인할 항목

현재 화면 또는 로그의 숫자 오류 코드가 `1216`인지 확인합니다.

현재 화면 또는 로그의 SQLSTATE가 `23000`인지 확인합니다.

현재 화면 또는 로그의 오류 메시지가 `Cannot add or update a child row: a foreign key constraint fails`와 일치하는지 확인합니다.

피해야 할 조치

주의

  • 오류 원문만으로 운영 데이터를 삭제하거나 외래 키 설정을 변경하지 않습니다.

환경별 원인과 조치

현재 화면 또는 로그에 표시된 오류를 다음 값과 대조합니다.

  • 숫자 오류 코드: 1216
  • SQLSTATE: 23000
  • 오류 이름: ER_NO_REFERENCED_ROW
  • 오류 메시지: Cannot add or update a child row: a foreign key constraint fails

오류 코드, SQLSTATE, 오류 메시지가 모두 일치하면 MariaDB 오류 코드 1216으로 식별합니다.

MariaDB는 MySQL과 오류 코드를 공유합니다.

관찰값 기록

문제가 발생한 URL 또는 화면, 표시 시각, 운영 환경과 최근 변경 사항을 먼저 기록합니다. 화면이나 로그에 오류 문구가 일부만 보이면 앞뒤 문장을 보존하고 비밀번호·토큰·쿠키·개인정보는 가립니다.

다음 항목을 실제 값과 함께 확인합니다.

  1. 현재 화면 또는 로그의 숫자 오류 코드가 1216인지 확인합니다.
  2. 현재 화면 또는 로그의 SQLSTATE가 23000인지 확인합니다.
  3. 현재 화면 또는 로그의 오류 메시지가 Cannot add or update a child row: a foreign key constraint fails와 일치하는지 확인합니다.

판정 기준

오류 문구가 일치해도 같은 원인이 확정되는 것은 아닙니다. 웹서버·런타임·운영체제·플랫폼과 최근 변경 사항을 비교하고, 기대한 관찰값이 나오지 않으면 다음 단계로 넘어가지 않습니다. 이 문서는 출처가 확인한 범위만 설명하며, 범위를 벗어난 원인과 조치는 단정하지 않습니다.

안전한 다음 확인

설정·권한·데이터를 변경하기 전에 백업과 되돌리기 방법을 기록합니다. 운영 환경의 방화벽 전체 해제, 인증서 검증 우회, 데이터 삭제, 비밀값 공개를 기본 조치로 사용하지 않습니다. 확인 결과가 문서의 조건과 다르면 관련 Platform·Component 문서와 공식 출처를 먼저 확인합니다.

원인 분포

[Observation] 수집된 3건에서 확인된 원인 또는 원인 후보는 다음과 같습니다.

분류관측 사례
부모 행 부재 또는 잘못된 참조값사례 1에서 자식의 UserID가 부모 테이블에 없는 값을 참조했습니다.
스키마·환경 차이사례 2에서 로컬·운영 MySQL 버전 차이로 테이블·열 이름 대소문자가 달라졌습니다.
기존 데이터·제약조건 적용 순서사례 1의 토론에서 같은 증상을 만드는 사례로 기록되었습니다.
스토리지 엔진 불일치사례 1의 토론에서 같은 증상을 만드는 사례로 기록되었습니다.
애플리케이션 재가져오기 경로사례 3에서 Native XML 플러그인의 기존 문서 재가져오기 중 오류가 발생했지만, 제공된 원문만으로 구체적 근본원인은 확인할 수 없습니다.

[Observation] 위 분류는 관측된 사례 기준이며 실제 발생 빈도를 의미하지 않습니다.

오진 함정

  • [Observation] 개발 환경에서 정상 동작해도 운영 환경의 MySQL 버전 차이와 테이블·열 이름 대소문자 차이로 덤프 가져오기가 실패할 수 있습니다.
  • [Observation] 오류가 자식 INSERT에서 발생하더라도 자식 데이터만 확인하면 부족할 수 있습니다. 부모 행의 존재 여부, 기존 데이터와 외래 키 추가 순서, 부모·자식 테이블의 스토리지 엔진을 함께 확인해야 합니다.
  • [Observation] 사례 3은 재현 절차와 실패한 참조, 수정 PR이 기록되어 있지만 제공된 원문에는 구체적인 근본원인이 없습니다. 원인을 임의로 단정하면 안 됩니다.

환경 매트릭스

환경·경로증상확인된 수정 또는 상태
MySQL 애플리케이션의 자식 테이블 INSERT외래 키 오류부모 테이블에 참조 대상 행이 있는지 확인해야 합니다.
Windows 개발 환경 → Ubuntu 운영 배포 후 덤프 가져오기모든 자식 INSERT가 외래 키 오류로 실패이름을 바로잡아 재가져오거나 운영 버전과 같은 mysqldump를 사용했습니다.
OJS 3.4.0rc3 Native XML 플러그인기존 문서 재가져오기 중 1452 오류수정 PR #8952와 함께 이슈가 종료되었습니다. 구체적 수정 내용은 제공된 원문에 없습니다.

진단 순서

  1. [Observation] 실패한 자식 행의 외래 키 값과 참조 대상 부모 테이블의 행 존재 여부를 대조합니다.
  2. [Observation] 덤프 또는 재가져오기에서 사용하는 테이블·열 이름이 대상 환경의 실제 이름과 일치하는지 확인합니다. 특히 로컬·운영 MySQL 버전 차이가 있는지 확인합니다.
  3. [Observation] 부모 테이블과 자식 테이블의 스토리지 엔진이 일치하는지 확인합니다.
  4. [Observation] 기존 데이터가 있는 상태에서 외래 키를 추가했는지, 제약조건 적용 순서가 적절했는지 확인합니다.
  5. [Observation] 오류가 특정 애플리케이션의 재가져오기 경로에서만 발생하면 재현 절차와 실패한 참조를 기록하고 관련 수정 사항을 확인합니다.

[Hypothesis] 위 순서는 수집된 사례에서 확인된 점검 항목을 증상 확인부터 환경·가져오기 경로 확인 순서로 배열한 것입니다.

참고 자료

MariaDB Error Code Reference | Server | MariaDB Documentation (새 창에서 열림)

MariaDB · 공식 자료 · 확인 범위: MariaDB 오류 출력에는 숫자 오류 코드, 5자 SQLSTATE 값, 오류 설명 문자열이 포함됩니다., 오류 코드 1216의 SQLSTATE는 23000입니다., 오류 코드 1216의 오류 이름은 ER_NO_REFERENCED_ROW입니다., 오류 코드 1216의 오류 메시지는 `Cannot add or update a child row: a foreign key constraint fails`입니다., MariaDB는 MySQL과 오류 코드를 공유합니다. · 확인일: 2026-07-24

Stack Overflow · 운영 사례 (새 창에서 열림)

확인 범위: 자식 테이블 INSERT가 외래 키 오류로 실패했습니다., 높은 투표를 받은 답변은 자식의 UserID가 부모 테이블에 없는 값을 참조한다고 설명합니다., 기존 데이터와 외래 키 추가 순서, 부모·자식 테이블의 스토리지 엔진 불일치도 같은 증상을 만든 사례로 기록되어 있습니다. · 확인일: 2026-07-29

Stack Overflow · 운영 사례 (새 창에서 열림)

확인 범위: Windows에서는 동작하던 ASP.NET Core와 MySQL 애플리케이션이 Ubuntu 배포 후 덤프를 가져올 때 모든 자식 INSERT에서 외래 키 오류가 발생했습니다., 로컬·운영 MySQL 버전 차이로 덤프의 테이블·열 이름 대소문자가 달라진 것이 원인으로 확인되었습니다., 이름을 바로잡아 다시 가져오거나 운영 버전과 같은 mysqldump를 사용해 해결했습니다. · 확인일: 2026-07-29

GitHub (pkp/pkp-lib) · 운영 사례 (새 창에서 열림)

확인 범위: OJS 3.4.0rc3에서 Native XML 플러그인으로 기존 문서를 다시 가져올 때 1452 외래 키 오류가 발생했습니다., 저장소에 재현 절차와 실패한 참조가 기록되어 있습니다., 연결된 수정 PR #8952와 함께 이슈가 closed 상태로 종료되었습니다. · 확인일: 2026-07-29