MySQL - 업서트: 초보자 가이드

안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 MySQL의 마법적인 세계로 뛰어들어 '업서트(Upsert)'라는 강력한 개념을 탐구해보겠습니다. 이 용어를 들어보지 않았다면 걱정하지 마세요 - 이 튜토리얼이 끝나면 프로처럼 업서트를 할 수 있을 것입니다!

MySQL - Upsert

업서트는 무엇인가요?

자, 구체적인 내용으로 들어가기 전에 '업서트(Upsert)'라는 것이 무엇인지 이해해보겠습니다. 친구들의 좋아하는 아이스크림 맛을 관리하는 목록을 가지고 있다고 상상해보세요. 새로운 친구의 선호도를 추가하고 싶지만, 그들이 이미 목록에 있다면 어떻게 하나요? 여기서 업서트가 유용해집니다!

업서트는 'Update'와 'Insert'의 조합입니다. MySQL에게 "이 사람이 목록에 이미 있다면 그들의 맛을 업데이트하고, 아니라면 새로운 항목으로 추가해줘"라고 말하는 것과 같습니다. 꽤 멋질 것 같죠?

MySQL의 UPSERT 연산

MySQL에서는 단일 'UPSERT' 명령어가 없습니다. 대신, 이 연산을 달성할 수 있는 몇 가지 다른 방법이 있습니다. 하나씩 탐구해보겠습니다!

INSERT IGNORE를 사용한 UPSERT

우리의 첫 번째 방법은 INSERT IGNORE를 사용하는 것입니다. 이는 "이 데이터를 추가하려고 하지만, 중복이 있다면 무시하고 계속 진행하라"고 말하는 것과 같습니다.

먼저 아이스크림 선호도를 위한 간단한 테이블을 만들어보겠습니다:

CREATE TABLE ice_cream_preferences (
friend_id INT PRIMARY KEY,
friend_name VARCHAR(50),
favorite_flavor VARCHAR(50)
);

이제 데이터를 추가해보겠습니다:

INSERT IGNORE INTO ice_cream_preferences (friend_id, friend_name, favorite_flavor)
VALUES (1, 'Alice', 'Chocolate'),
(2, 'Bob', 'Vanilla'),
(1, 'Alice', 'Strawberry');

이 예제에서, 우리는 Alice를 두 번 다른 맛으로 추가하려고 합니다. INSERT IGNORE 명령어는 첫 번째 Alice의 행을 추가하지만 두 번째 행은 friend_id가 중복되므로 무시합니다.

REPLACE를 사용한 UPSERT

다음 방법은 REPLACE를 사용하는 것입니다. 이는 더 공격적입니다 - "이 데이터를 테이블에 넣고, 같은 키가 이미 있다면旄ld 데이터를 지우고 새로운 데이터를 추가하라"고 말하는 것과 같습니다.

이를 시도해보겠습니다:

REPLACE INTO ice_cream_preferences (friend_id, friend_name, favorite_flavor)
VALUES (1, 'Alice', 'Strawberry'),
(3, 'Charlie', 'Mint Chocolate Chip');

이 경우, Alice의 맛이 Strawberry로 업데이트되고 Charlie가 새로운 항목으로 추가됩니다.

INSERT와 ON DUPLICATE KEY UPDATE를 사용한 UPSERT

마지막 방법은 가장 유연합니다. "이 데이터를 추가하려고 하지만, 중복이 있다면 특정 열을 업데이트하라"고 말하는 것과 같습니다.

이렇게 작동합니다:

INSERT INTO ice_cream_preferences (friend_id, friend_name, favorite_flavor)
VALUES (1, 'Alice', 'Rocky Road'),
(4, 'David', 'Cookie Dough')
ON DUPLICATE KEY UPDATE
favorite_flavor = VALUES(favorite_flavor);

이 예제에서, Alice의 맛이 Rocky Road로 업데이트되고 David가 새로운 항목으로 추가됩니다.

방법 비교

우리의 세 가지 업서트 방법을 편리한 표로 요약해보겠습니다:

방법 중복 키 행동
INSERT IGNORE 새로운 데이터 무시
REPLACE 旄ld 데이터 지우고 새로운 데이터 추가
INSERT...ON DUPLICATE KEY UPDATE 지정된 열 업데이트

실제 사례: 아이스크림 가게 인벤토리

이제 새로운 지식을 실제 사례에 적용해보겠습니다. 아이스크림 가게를 운영하고 있으며, 판매나 재고를 업데이트해야 하는 상황을 상상해보세요.

먼저 인벤토리 테이블을 만들어보겠습니다:

CREATE TABLE ice_cream_inventory (
flavor VARCHAR(50) PRIMARY KEY,
quantity INT,
last_updated TIMESTAMP
);

이제 초기 데이터를 추가해보겠습니다:

INSERT INTO ice_cream_inventory (flavor, quantity, last_updated)
VALUES ('Chocolate', 100, NOW()),
('Vanilla', 150, NOW()),
('Strawberry', 75, NOW());

판매나 재고를 업데이트할 때 업서트 연산을 사용할 수 있습니다:

INSERT INTO ice_cream_inventory (flavor, quantity, last_updated)
VALUES ('Chocolate', 90, NOW()),
('Mint Chocolate Chip', 50, NOW())
ON DUPLICATE KEY UPDATE
quantity = VALUES(quantity),
last_updated = VALUES(last_updated);

이 명령어는:

  1. Chocolate의 수량을 90으로 업데이트
  2. Mint Chocolate Chip 항목을 새로 추가
  3. 두 맛의 last_updated 타임스탬프를 업데이트

이게 멋질까요? 단 한 명령어으로 기존 데이터를 업데이트하고 새로운 데이터를 추가할 수 있습니다!

결론

이제 여러분은 MySQL의 업서트를 통해 여정을 마쳤습니다. INSERT IGNORE에서 강력한 INSERT...ON DUPLICATE KEY UPDATE까지, 각 방법은 자신만의 장점을 가지고 있습니다. 필요에 따라 적절한 방법을 선택하시기 바랍니다.

MySQL의 여정을 계속하면서, 업서트 연산이 깨끗하고 최신 데이터를 유지하는 데 매우 유용하다는 것을 발견할 것입니다. 마치 마법의 스푼으로 아이스크림을 먹고 동시에 냉장고를 정리하는 것과 같습니다!

계속 연습하고 호기심을 가지세요, 그러면 언제든지 팀의 MySQL 마에스트로가 될 수 있습니다. 다음 번까지 행복한 코딩과 항상 완벽한 데이터베이스 조화를 기원합니다!

Credits: Image by storyset