MySQL(DB)

[바미] MySQL - Upsert

Bami 2024. 3. 21. 17:27
728x90
반응형

데이터베이스에 레코드를 삽입할 때 해당 레코드의 키가 이미 존재하면 업데이트를 실행하는 기능을 말하는데 중복 삽입을 방지하고, 기존 레코드를 필요에 따라 갱신할 수 있도록 할 때 굉장히 유용한 쿼리에요.

 

MySQL에서는 주로 INSERT ... ON DUPLICATE KEY UPDATE 구문을 사용해요.


INSERT ... ON DUPLICATE KEY UPDATE

INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...)
ON DUPLICATE KEY UPDATE 컬럼1 = 값1, 컬럼2 = 값2, ...;

INSERT ... ON DUPLICATE KEY UPDATE 구문은 레코드를 삽입하려 할 때 유니크 제약 조건 (PRIMARY KEY, UNIQUE INDEX)을 위반하는 경우 지정된 컬럼을 업데이트 해줘요.

 

이 형식에 맞는 쿼리로 예시를 들어보죠.

INSERT INTO users (id, email, last_login)
VALUES (1, 'user@example.com', NOW())
ON DUPLICATE KEY UPDATE last_login = VALUES(last_login);

id가 1인 사용자를 삽입하려고 시도할 때 id를 가진 사용자가 이미 존재한다면, last_login 컬럼만 현재 시각으로 업데이트하는 예제에요.

참고로 VALUES(last_login) 함수는 INSERT 구문에서 사용된 last_login의 값을 참조하고 있어요!

 

REPLACE INTO

또 다른 방법으로 REPLACE INTO 구문을 사용할 수 있지만 이 방법은 기존 레코드를 삭제하고 새로운 레코드를 삽입하는 방식이라 실제로는 업데이트보다는 레코드의 삭제와 삽입이 동시에 일어나는 특별한 경우에 사용해요.

 

사용 방법은 INSERT와 유사하지만, 기존 레코드가 있을 경우 삭제 후 새로 삽입한다는 점이 달라요.

REPLACE INTO users (id, name, age) VALUES (1, 'John', 30);

사용 시 고려사항

ON DUPLICATE KEY UPDATE는 키 충돌이 발생할 때만 업데이트를 실행하여 업데이트할 컬럼과 값을 지정할 때 VALUES() 함수를 사용하여 INSERT에 사용된 값을 참조할 수 있어요.

 

성능 측면에서 ON DUPLICATE KEY UPDATE 구문은 REPLACE INTO는 레코드의 삭제와 삽입을 두 번의 작업으로 처리하기 때문에 REPLACE INTO에 비해 더 효율적 일 수 있어요.

 

728x90
반응형