REPLACE INTO란 무엇인가?
MySQL의 REPLACE INTO 구문은 기존 레코드를 삭제(DELETE)하고 새 레코드를 삽입(INSERT)하는 작업을 한 번에 수행할 수 있는 편리한 기능입니다. 동일한 고유 키를 가진 레코드가 이미 존재하면 해당 레코드를 삭제한 후 새 데이터로 대체하기 때문입니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
Id int,
FirstName varchar(50)
);
Query OK, 0 rows affected (0.60 sec)고유 인덱스(Unique Index) 생성
REPLACE INTO가 정상적으로 작동하려면 중복 판단 기준이 되는 고유 인덱스가 필요합니다. 다음 쿼리로 Id 컬럼에 고유 인덱스를 추가합니다.
mysql> alter table DemoTable add unique id_index(Id); Query OK, 0 rows affected (0.41 sec) Records: 0 Duplicates: 0 Warnings: 0
REPLACE INTO로 레코드 삽입 및 교체하기
이제 insert 명령 대신 replace into 명령을 사용하여 레코드를 추가해 보겠습니다. 여기서 주목할 점은 Id 100을 가진 레코드를 두 번 삽입했다는 것입니다. 고유 인덱스가 설정되어 있기 때문에, 두 번째 삽입 시 새 레코드가 단순히 추가되지 않고 기존 레코드(Id 100)가 삭제된 후 새 레코드로 교체됩니다.
mysql> replace into DemoTable values(100,'Chris'); Query OK, 1 row affected (0.10 sec) mysql> replace into DemoTable values(101,'David'); Query OK, 1 row affected (0.13 sec) mysql> replace into DemoTable values(100,'Bob'); Query OK, 2 rows affected (0.16 sec)
실행 결과를 자세히 보면 마지막 쿼리에서 '2 rows affected'가 출력된 것을 확인할 수 있습니다. 이는 기존 레코드 1개가 삭제되고 새 레코드 1개가 삽입되었음을 의미하며, REPLACE INTO가 DELETE + INSERT 방식으로 동작한다는 것을 보여주는 핵심 포인트입니다.
결과 확인
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------+-----------+ | Id | FirstName | +------+-----------+ | 100 | Bob | | 101 | David | +------+-----------+ 2 rows in set (0.00 sec)
정리
출력 결과에서 알 수 있듯이, Id 100에는 처음 삽입한 'Chris'가 아닌 나중에 삽입한 'Bob'이 저장되어 있습니다. 즉, REPLACE INTO는 동일한 고유 키를 가진 기존 레코드를 삭제하고 새 레코드로 대체하는 방식으로 작동합니다. 이를 활용하면 upsert 로직을 간단하게 구현할 수 있어, 중복 데이터 관리에 매우 유용합니다.