MySQL에서 데이터를 삽입할 때 가장 많이 발생하는 문제 중 하나가 중복 키 오류(Duplicate Entry)이다.
특히 기본 키나 UNIQUE 제약 조건이 설정된 테이블에 데이터를 삽입할 때
이미 존재하는 값이 들어가면 에러가 발생하고 쿼리가 중단된다.
이런 상황에서 안전하게 삽입을 시도하고, 오류가 발생해도 무시하고 넘어가고 싶을 때 사용하는 명령어가
바로 INSERT IGNORE이다.
🔍 INSERT IGNORE란?
INSERT IGNORE는 MySQL에서 INSERT 문을 실행할 때 제약 조건 위반, 중복 키 오류 등의 에러를 무시하고 쿼리를 계속 진행하도록 만드는 명령어이다.
즉, 일반적인 INSERT에서는 중복된 값이 있으면 오류가 발생해 전체 쿼리가 실패하지만,
IGNORE를 사용하면 그 행만 건너뛰고 나머지 작업은 그대로 실행된다.
기본 구문
INSERT IGNORE INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...);
- 중복된 기본 키나 UNIQUE 값이 있는 경우, 해당 행은 무시되고 에러 없이 쿼리가 끝난다.
- 나머지 정상적인 행은 모두 INSERT 된다.
✅ 기본 예제 – users 테이블에 중복된 ID 삽입 시 처리
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 기존 데이터
INSERT INTO users VALUES (1, '김철수');
-- 중복된 ID를 삽입
INSERT IGNORE INTO users (id, name) VALUES (1, '이영희'), (2, '박민수');
이 예제에서는 id = 1이 이미 존재하므로 일반 INSERT라면 에러가 발생하지만,
INSERT IGNORE를 사용하면 id = 1은 무시되고 id = 2만 정상적으로 삽입된다.
🧪 실전 예제 – 다중 행 INSERT와 함께 사용
INSERT IGNORE INTO users (id, name)
VALUES
(3, '최지은'),
(1, '이영희'), -- 이미 존재하는 ID
(4, '송하늘');
중간에 중복된 값이 있어도 전체 쿼리는 멈추지 않고
나머지 정상적인 데이터는 그대로 INSERT된다.
대량 데이터 이관, 백업 복구, 사용자 등록 등에서 매우 유용하다.
✅ INSERT IGNORE의 동작 원리
- 중복 키 충돌 → 해당 행 무시 (에러 발생하지 않음)
- NOT NULL 위반 → 해당 행 무시
- 외래 키 오류 → 무시하고 넘어감
- 제약 조건 위반 → 경고로 기록되며 삽입되지 않음
즉, 무시 가능한 범위 내에서만 삽입이 진행되고,
전체 쿼리가 중단되지 않도록 방어적인 삽입 처리를 도와주는 기능이다.
🧠 실무에서 INSERT IGNORE가 유용한 상황
- 크롤링된 데이터 중 중복이 존재할 가능성이 있을 때
- 기존 사용자 테이블에 중복 가입을 방지하면서 데이터 삽입 시
- 과거 데이터를 대량 이관할 때 중복으로 인해 전체 작업이 중단되는 것을 막기 위해
- 일회성 데이터 로그 기록 시 유효성 검증 없이 빠르게 삽입할 때
-- 데이터 정제 없이 수집 로그 기록
INSERT IGNORE INTO access_logs (ip, action, created_at)
VALUES ('192.168.0.1', 'visit', NOW());
🔄 INSERT IGNORE vs INSERT vs REPLACE 비교
항목 | INSERT | INSERT IGNORE | REPLACE |
중복 키 처리 | 에러 발생 | 무시하고 진행 | 기존 데이터 삭제 후 새로 삽입 |
속도 | 빠름 | 빠름 + 안전 | 삭제 후 삽입이라 느릴 수 있음 |
용도 | 일반 삽입 | 에러 방지용 삽입 | 기존 데이터 덮어쓰기 |
위험성 | 낮음 | 매우 낮음 | 데이터 손실 가능성 있음 |
⚠️ 주의사항
- INSERT IGNORE는 데이터가 실제로 삽입되지 않더라도 성공한 것처럼 보일 수 있기 때문에, 반드시 영향을 받은 행 수를 확인하는 것이 좋다.
- 중복 여부를 판단하는 키 또는 제약 조건이 없다면 IGNORE는 아무 효과도 없다.
- REPLACE와 혼동하지 말 것. REPLACE는 기존 데이터를 삭제한 후 새로 삽입하기 때문에 PK 외의 컬럼 값이 유실될 수 있다.
✅ INSERT IGNORE 트랜잭션과 함께 사용하기
SET autocommit = 0;
START TRANSACTION;
INSERT IGNORE INTO users (id, name) VALUES (5, '김나현');
INSERT IGNORE INTO users (id, name) VALUES (1, '김철수'); -- 중복 무시
COMMIT;
트랜잭션 안에서도 INSERT IGNORE는 정상 동작하며, 전체 쿼리 흐름을 중단시키지 않는다.
📌 요약
- INSERT IGNORE는 데이터 삽입 시 발생할 수 있는 오류를 무시하고 안전하게 진행할 수 있는 MySQL 전용 기능이다.
- 중복된 키나 제약 조건 위반이 있어도 전체 쿼리가 중단되지 않아 실무에서 매우 자주 사용된다.
- 로그 수집, 크롤링, 백업 복구, 데이터 마이그레이션 등에 최적화된 삽입 방식이다.
- 반드시 중복 무시 여부를 확인할 수 있는 키나 제약 조건이 테이블에 존재해야 한다.
📎 공식 문서 참고
MySQL INSERT IGNORE 공식 문서
https://dev.mysql.com/doc/refman/8.0/en/insert.html
'DB' 카테고리의 다른 글
[MySQL] INSERT + AUTO_INCREMENT 사용법 완벽 가이드 (0) | 2025.06.20 |
---|---|
[MySQL] INSERT + 트랜잭션(Transaction) 연동 완벽 가이드 (2) | 2025.06.20 |
[MySQL] INSERT + SELECT 사용법 완벽 가이드 (0) | 2025.06.20 |
[MySQL] 있으면 UPDATE, 없으면 INSERT (오라클의 MERGE INTO) (2) | 2025.06.19 |
[MySQL] INSERT INTO ... SET 사용법 완벽 가이드 (1) | 2025.06.19 |
[MySQL] INSERT 다중 행 삽입 사용법 완벽 가이드 (1) | 2025.06.19 |
[MySQL] INSERT 기본 사용법 완벽 가이드 (0) | 2025.06.19 |
[MySQL] SET autocommit = 0/1 완벽 가이드 사용법(오토커밋 설정) (2) | 2025.06.18 |