DB

[MySQL] REPLACE VS INSERT 차이점 완벽 정리

인생아 2025. 6. 20. 15:37
반응형

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, '김철수');

이 쿼리는 다음과 같이 작동한다.

  1. id = 1이 이미 존재 → 기존 행 삭제
  2. 새로운 행 삽입 → 새 값이 들어감

즉, 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

 

반응형