๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/DB & SQL

[MySQL] UPSERT (ON DUPLICATE KEY UPDATE)

by ์•ˆ์ฃผํ˜• 2022. 5. 23.

์„œ๋ก 

MySQL์—์„œ UPDATE ๋ฌธ๊ตฌ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๋•Œ๋งŒ UPDATE๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฎ์–ด ์”Œ์šฐ๊ธฐ ๊ธฐ๋Šฅ ์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ UPDATE๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์กด์žฌํ•˜์ง€ ์•Š๋‹ค๋ฉด INSERT๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๊ฒ€์ฆ ํ›„ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋ถ„๊ธฐ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค๋„ ๋˜์ง€๋งŒ ํ˜น์‹œ๋‚˜ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์„๊นŒ ์‹ถ์–ด์„œ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

 

MySQL UPSERT

UPSERT๋Š” ์ด๋ฆ„์—์„œ๋„ ๋ณด์ด๋“ฏ์ด UPDATE์™€ INSERT๋ฅผ ํ•ฉ์นœ ๋‹จ์–ด์ž…๋‹ˆ๋‹ค. MySQL์—์„œ๋Š” ์ด๋Ÿฌํ•œ UPSERT ๊ธฐ๋Šฅ์„ 4.1 ์ด์ƒ ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, UPSERT๋Š” ์ค‘๋ณต๋˜๋Š” ๊ฐ’(UNIQUE KEY)์ด ์žˆ๋‹ค๋ฉด UPDATE๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ์—†๋‹ค๋ฉด INSERT๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. UPSERT๋Š” ON DUPLICATE KEY UPDATE๋ฅผ INSERT๋ฌธ๊ตฌ ๋’ค์— ๋ถ™์ž„์œผ๋กœ์จ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

ON DUPLICATE KEY UPDATE๋Š” ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์‹œ UNIQUE KEY๊ฐ€ ์žˆ์œผ๋ฉด(์ค‘๋ณต๋˜๋ฉด) ์ง€์ •ํ•œ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ(๋ฎ์–ด์“ฐ๊ธฐ) ํ•˜๊ณ , ์—†๋‹ค๋ฉด INSERT๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

INSERT INTO ํ…Œ์ด๋ธ”๋ช… 
    (userId, name, age) 
VALUES 
    (1, '์•ˆ์ฃผํ˜•', 25) 
ON DUPLICATE KEY UPDATE 
    name = '์•ˆ์ฃผํ˜•', 
    age = 19;

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ์˜ UNIQUE KEY๋Š” userId๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์ˆ˜ํ–‰์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ•ด๋‹น ํ…Œ์ด๋ธ”์— userId 1์ด ์—†๋‹ค๋ฉด (1, '์•ˆ์ฃผํ˜•', 25)๋ฅผ insert ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ userId 1์ด ์กด์žฌํ•œ๋‹ค๋ฉด {name = '์•ˆ์ฃผํ˜•', age = 19}๋กœ update ํ•ฉ๋‹ˆ๋‹ค.

 

๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ DB์—์„œ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์˜ ํ‘œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

DataBase Query
MySQL ON DUPLICATE KEY UPDATE
Oracle MERGE INTO
MSSQL IN NOT EXISTS

๋Œ“๊ธ€