DEV WIKI
백엔드 · 오류·증상

Can't write; duplicate key in table '%s'

MySQL ER_DUP_KEY 오류 메시지를 오류 번호와 SQLSTATE로 대조해 식별합니다.

빠른 답변

우선 확인할 원인
이 메시지는 MySQL 오류 번호 1022, 심볼 ER_DUP_KEY, SQLSTATE 23000에 해당합니다.
먼저 확인할 항목
현재 화면 또는 로그의 메시지 문자열을 원문의 "Can't write; duplicate key in table '%s'" 형식과 대조합니다.
적용 범위
현재 증상과 본문에 적은 관찰 조건이 함께 확인된 경우
출처 확인일
2026-07-29
최종 검토
2026-07-24
수정일
2026-07-27
오류·수정 제보 (새 창에서 열림)

현재 증상

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

먼저 확인할 항목

현재 화면 또는 로그의 메시지 문자열을 원문의 "Can't write; duplicate key in table '%s'" 형식과 대조합니다.

오류 코드가 표시되면 1022인지, SQLSTATE가 표시되면 23000인지 확인합니다.

피해야 할 조치

주의

  • 오류 원문만으로 중복 레코드를 삭제하거나 고유 키를 변경하지 않습니다.

환경별 원인과 조치

확인

현재 화면 또는 로그의 오류가 Can't write; duplicate key in table '로 시작하고 테이블 이름 뒤에 '가 붙는지 확인합니다.

오류 코드가 함께 표시되면 1022인지 확인합니다. SQLSTATE가 함께 표시되면 23000인지 확인합니다.

이 값들이 일치하면 해당 오류는 ER_DUP_KEY입니다.

범위

이 문서는 오류 식별만 다룹니다. 원문은 이 오류에 대한 원인 분석이나 복구 절차를 제공하지 않습니다.

출처

MySQL 8.0 Server Error Message Reference (새 창에서 열림)

관찰값 기록

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

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

  1. 현재 화면 또는 로그의 메시지 문자열을 원문의 "Can't write; duplicate key in table '%s'" 형식과 대조합니다.
  2. 오류 코드가 표시되면 1022인지, SQLSTATE가 표시되면 23000인지 확인합니다.

판정 기준

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

안전한 다음 확인

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

원인 분포

[Observation] 입력된 사례 3건 모두 Error 1022의 원인으로 다른 테이블과 중복된 foreign key constraint 이름을 보고했습니다.

[Observation] 이 분포는 수집된 사례 기준이며, 실제 발생 빈도를 의미하지 않습니다.

오진 함정

[Observation] 오류 메시지에 duplicate key가 포함되어도, 사례에서는 서로 다른 열에 제약 조건을 만들었거나 단일 foreign key를 정의하는 상황에서 발생했습니다.

[Observation] 따라서 열의 값이나 인덱스 중복만 확인하면 원인을 놓칠 수 있으며, 다른 테이블의 foreign key constraint 이름 중복도 확인해야 합니다.

환경 매트릭스

사례실행 환경·상황관측된 원인수정
1CREATE TABLE다른 테이블과 foreign key constraint 이름 중복information_schema로 사용 위치 확인 후 고유한 이름으로 변경
2MySQL 5.7, 서로 다른 열에 제약 조건 생성다른 테이블과 foreign key constraint 이름 중복고유한 이름 지정 또는 MySQL의 이름 생성 사용
3새 테이블의 단일 foreign key 정의모델 전체에서 foreign key constraint 이름 충돌충돌한 constraint 이름 변경

진단 순서

  1. [Observation] CREATE TABLE 또는 foreign key 정의에서 Error 1022가 발생했는지 확인합니다.
  2. [Observation] 오류 대상이 열이나 값이 아니라 foreign key constraint 이름일 가능성을 확인합니다.
  3. [Observation] 다른 테이블에서 같은 constraint 이름이 사용되는지 확인합니다. 사례 1에서는 information_schema를 사용했습니다.
  4. [Observation] 충돌하는 constraint 이름을 데이터베이스 또는 모델 범위에서 고유하게 변경합니다.
  5. [Observation] MySQL 5.7 사례에서는 고유한 이름을 직접 지정하거나 MySQL에 이름 생성을 맡기는 방법으로 해결했습니다.

참고 자료

MySQL :: MySQL 8.0 Error Reference :: 2 Server Error Message Reference (새 창에서 열림)

MySQL · 공식 자료 · 확인 범위: MySQL은 이 오류에 오류 번호 1022, 심볼 ER_DUP_KEY, SQLSTATE 23000을 지정합니다., MySQL은 메시지 문자열을 "Can't write; duplicate key in table '%s'"로 지정합니다. · 확인일: 2026-07-24

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

확인 범위: CREATE TABLE 실행 중 Error 1022가 발생했다., 다른 테이블에서 사용 중인 foreign key constraint 이름을 재사용한 것이 원인이었다., information_schema에서 사용 위치를 확인하고 데이터베이스 전체에서 고유한 제약 조건 이름으로 변경해 해결했다. · 확인일: 2026-07-29

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

확인 범위: 서로 다른 열에 제약 조건을 만들었는데도 MySQL 5.7에서 Error 1022가 발생했다., 다른 테이블에 동일한 foreign key constraint 이름이 존재했다., 고유한 이름을 지정하거나 이름 생성을 MySQL에 맡겨 해결했다. · 확인일: 2026-07-29

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

확인 범위: 새 테이블의 단일 foreign key 정의에서 MySQL Error 1022가 발생했다., foreign key 제약 조건 이름이 열 이름과 별개로 모델 전체에서 충돌할 수 있었다., 충돌한 constraint 이름을 변경해 테이블 생성에 성공했다. · 확인일: 2026-07-29