MySQL의 INSERT IGNORE는 중복 외 오류도 무시: 11가지 대상 오류와 안전한 대체 방법
요약
MySQL의 `INSERT IGNORE`는 단순 중복 건너뛰기를 넘어 NOT NULL 위반, 외부 키 위반 등 11가지 오류를 경고로 처리합니다. 따라서 데이터 복사 시에는 중복만 안전하게 무시하고 다른 오류에 대해서는 반드시 실패해야 할 때 `ON DUPLICATE KEY UPDATE` 구문을 사용하는 것이 더 안전합니다.
핵심 포인트
- `INSERT IGNORE`는 단순 중복 외 11가지 오류를 경고로 처리함.
- 데이터 복사 시에는 `ON DUPLICATE KEY UPDATE` 사용이 권장됨.
- 외부 데이터 복사 시, `IGNORE`는 값 반올림 등 위험할 수 있음.
- 오류 발생 시 처리가 중요하면 `ON DUPLICATE KEY UPDATE`를 사용해야 함.
INSERT IGNORE는 '중복된 행만 건너뛰는' 구문이 아닙니다.
- 중복 키 외에, NOT NULL 위반・외부 키 위반・파티션 불일치 등 총 11가지의 오류를 경고로 낮춥니다. -
- 범위 밖의 수치나 너무 긴 문자열은 오류가 나지 않고 비슷한 값으로 반올림하여 삽입됩니다. -
- strict mode보다 IGNORE가 우선합니다. 서버 설정을 엄격하게 해도 막을 수 없습니다.
중복만 건너뛰고 싶다면, 다음과 같이 작성해야 합니다.
INSERT INTO t (...) VALUES (...)
ON DUPLICATE KEY UPDATE id = id;
AI(Claude Code)에게 특정 DB의 로그를 1시간마다 별도의 DB로 추가 복사하는 처리를 작성하게 했습니다. 원본 로그는 오래된 행부터 덮어쓰여 사라지기 때문에, 그 전에 사본을 남기기 위함이었습니다.
누락 방지를 위해 이전보다 약간 앞쪽부터 다시 읽어오기 때문에, 중복은 매번 발생합니다. 사본 테이블에 유니크 키를 설정하고, 중복된 분은 버리는 설계로 이 코드가 나왔습니다.
INSERT IGNORE INTO log_copy (source_id, event_type, logged_at, status)
VALUES (?, ?, ?, ?);
적용하기 전에 Codex로 검토한 결과,
설정해 두었더라도 경고는 예외가 아니므로, 이 확인은 별도로 필요합니다.
INSERT INTO log_copy (source_id, event_type, logged_at, status)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE id = id;
중복일 때는 아무것도 변경하지 않고, 그 외의 오류는 평소대로 발생합니다. 다만 다음 3가지를 확인해 주세요.
- affected rows의 의미: 신규 삽입=1, 업데이트=2, 동치 업데이트=0.
id = id의 중복은 0이 됩니다 (CLIENT_FOUND_ROWS지정 시 1). - 유니크 키가 여러 개인 테이블: 어떤 키로 충돌했는지에 따라 업데이트 대상이 달라지므로, 공식 문서도 일반적으로 피해야 한다고 합니다.
- AUTO_INCREMENT 소비: InnoDB 기본 설정에서는 삽입되지 않았더라도 번호가 진행될 수 있습니다 (IGNORE도 마찬가지).
직접 구성한 고정값을 넣는 것만으로, NULL이나 범위 외가 발생할 리 없다고 단언할 수 있는 경우는 문제가 없습니다.
외부 데이터나 타 시스템의 테이블을 복사하는 처리에서는 피하는 것이 안전합니다. 원본 측에서 컬럼 정의가 바뀌어도, IGNORE를 포함한 처리는 조용히 값을 반올림하여 성공으로 간주하게 됩니다.
판단 기준은 하나입니다. '이 INSERT가 중복 이외의 이유로 실패했을 때, 멈춰야 하는가?' 만약 멈춰야 한다면 ON DUPLICATE KEY UPDATE를 사용해야 합니다.
- MySQL 8.0 Reference Manual - The Effect of IGNORE on Statement Execution
- MySQL 8.0 Reference Manual - INSERT Statement
- MySQL 8.0 Reference Manual - INSERT ... ON DUPLICATE KEY UPDATE Statement
이 글은 AI(Claude Code)에게 데이터베이스의 정기 복사 처리를 작성하게 하는 과정에서 얻은 내용을 정리한 것입니다. 같은 일을 AI 측면에서 작성한 것이 '쿠지라'와 'AI와'에 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기