반응형
MySQL을 사용하면서 가장 자주 고민하게 되는 것 중 하나는 REPLACE를 써야 할까? INSERT를 써야 할까? 하는 문제다.
두 문법은 겉으로 보면 비슷하지만, 작동 방식, 내부 처리, 성능, 부작용 측면에서 완전히 다른 SQL 명령어다.

🔍 INSERT란 무엇인가?
INSERT는 MySQL에서 데이터를 삽입하는 가장 기본적인 명령어다.
INSERT INTO users (id, name)
VALUES (1, '홍길동');
만약 id = 1이 이미 존재한다면?
에러가 발생한다.
-- 기본키 중복 발생 시 에러
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
즉, INSERT는 중복 데이터가 존재하면 실패한다.
반응형
🔄 INSERT를 우회하는 방법들
- INSERT IGNORE : 에러 발생 대신 무시
- INSERT ... ON DUPLICATE KEY UPDATE : 중복 시 UPDATE로 처리
- 이들과 달리, REPLACE는 전혀 다른 방식으로 중복을 처리한다.
🔁 REPLACE란 무엇인가?
REPLACE는 INSERT와 문법은 비슷하지만
중복 키가 있으면 기존 데이터를 삭제하고, 새 데이터를 삽입하는 특이한 동작을 한다.
REPLACE INTO users (id, name)
VALUES (1, '김철수');
이 쿼리는 다음과 같이 작동한다.
- id = 1이 이미 존재 → 기존 행 삭제
- 새로운 행 삽입 → 새 값이 들어감
즉, UPDATE가 아니라 DELETE + INSERT로 처리된다.
⚠️ REPLACE의 부작용과 주의사항
- 기존 행이 삭제되기 때문에, 연관된 외래키(foreign key), 트리거, 로그 등이 동작할 수 있다.
- 자동 증가 키(auto_increment)가 다시 증가할 수 있어 불필요한 ID 건너뜀이 발생할 수 있다.
- UPDATE처럼 필드만 수정되는 것이 아니라, 전체 레코드가 교체된다는 점을 꼭 이해해야 한다.
✅ REPLACE와 INSERT 차이점 비교 요약
| 구분 | INSERT | REPLACE |
| 중복 키 존재 시 | 에러 발생 | 기존 행 삭제 후 새 행 삽입 |
| 자동 증가 열 | 명시 안 하면 증가 | 중복일 경우에도 증가 |
| 트리거 처리 | INSERT 트리거만 | DELETE + INSERT 트리거 모두 발생 |
| 성능 | 빠름 | 느릴 수 있음 (DELETE + INSERT) |
| 외래키 영향 | 없음 | 외래키 참조 무결성에 영향 가능 |
반응형
🧪 실전 예제 – INSERT vs REPLACE 비교
-- users 테이블 생성
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 초기 데이터 삽입
INSERT INTO users VALUES (1, '홍길동');
-- INSERT (중복 에러)
INSERT INTO users VALUES (1, '김철수'); -- 실패
-- REPLACE (성공 + 기존 데이터 삭제됨)
REPLACE INTO users VALUES (1, '김철수'); -- 성공
REPLACE는 에러 없이 작동하지만,
실제로는 기존 레코드가 삭제된 뒤 새로운 레코드로 대체되었기 때문에
삭제 로그가 발생하거나 외래키 무결성이 깨질 수 있다.
🧠 실무에서는 언제 REPLACE를 써야 할까?
- 백업 → 복구 시 중복 키가 있을 가능성이 높은 경우
- 연관 데이터가 거의 없고, 기존 데이터 삭제에 대한 리스크가 없을 때
- 단순한 캐시 테이블처럼 교체 가능한 구조일 때
하지만 대부분의 실무에서는
INSERT ... ON DUPLICATE KEY UPDATE 방식이 더 안전하고 많이 사용된다.
💬 REPLACE는 UPDATE가 아니다!
많은 사람들이 REPLACE를 UPDATE처럼 착각하지만,
그 내부 로직은 명백히 DELETE + INSERT라는 것을 꼭 기억하자.
이로 인해 생길 수 있는 문제는 다음과 같다.
- AUTO_INCREMENT 값이 비정상적으로 증가
- 외래키 제약 조건 위반
- 트리거가 두 번 작동 (DELETE + INSERT)
반응형
✅ MySQL INSERT/REPLACE 요약
- INSERT는 중복 시 에러 → 안전하지만 제한적
- REPLACE는 중복 시 기존 행 삭제 → 강력하지만 위험
- 트랜잭션이나 데이터 무결성이 중요한 시스템에서는
REPLACE 사용을 자제하고 UPDATE나 UPSERT 구문을 사용하는 것이 좋다
📎 공식 문서 참고
MySQL REPLACE 공식 문서
https://dev.mysql.com/doc/refman/8.0/en/replace.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] SELECT ORDER BY 정렬 방법 완벽 정리 (0) | 2025.06.24 |
|---|---|
| [MySQL] SELECT WHERE 조건절 완벽 정리 (1) | 2025.06.24 |
| [MySQL] SELECT 기본 조회 방법 완벽 정리 (0) | 2025.06.24 |
| [MySQL] 대량 INSERT 성능 최적화 방법 완벽 정리 (1) | 2025.06.20 |
| [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 |