IT/DataBase

[MySQL/MariaDB] merge(๊ฐ’์ด ์žˆ์œผ๋ฉด update, ์•„๋‹ˆ๋ฉด insert)(feat. ON DUPLICATE KEY UPDATE...)

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2022. 11. 22.

MySQL INSERT INTO...ON DUPLICATE KEY UPDATE... ๐Ÿ˜ƒ

mysql์—๋„ Oracle์˜ merge into์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ๋˜์–ด ๋ฏธ๋ž˜์˜ ๋‚ด๊ฐ€ ๋ณด๊ธฐ์œ„ํ•ด ๊ธฐ๋กํ•จ

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ…Œ์ด๋ธ” ํ•˜๋‚˜ ์ƒ์„ฑ

CREATE TABLE `test_220714` (
  `id` bigint(20) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ 2๊ฐœ ์ •๋„ ์ž…๋ ฅ

INSERT INTO test_220714(id, name)VALUES(1, 'ironMan');
INSERT INTO test_220714(id, name)VALUES(2, 'thor');

DBeaver์™€ ๊ฐ™์€ ํˆด์„ ์‚ฌ์šฉํ•˜๋ฉด SQL์„ ์ƒ์„ฑํ•ด์ฃผ๋‹ˆ๊นŒ ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ํŽธํ•˜๋‹ค.

์ด ์ƒํƒœ์—์„œ ๊ฐ’์ด ์ด๋ฏธ ์žˆ์œผ๋ฉด ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๊ณ  ์—†์œผ๋ฉด insert๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด SQL์„ ์ž‘์„ฑํ•ด์„œ ์‹คํ–‰ํ•ด๋ณด๊ฒ ๋‹ค.

INSERT INTO test_220714(id, name)
VALUES('1', 'odin')
ON DUPLICATE KEY UPDATE
	name = 'odin'
;

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ id๊ฐ€ 1๋ฒˆ์ธ ๋ฐ์ดํ„ฐ์˜ name์ด odin์œผ๋กœ ๋ณ€๊ฒฝ๋œ๊ฑธ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ SQL์„ ์‹คํ–‰ํ•˜๋ฉด 3๋ฒˆ ์งธ ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค.

INSERT INTO test_220714
(id, name)
VALUES('3', 'xman')
ON DUPLICATE KEY UPDATE
	name = 'xman'
;

INSERT INTO... ๋’ค์— ๋ถ™์€ ON DUPLICATE KEY UPDATE ์ด ๊ตฌ๋ฌธ์ด ์ด ์—ญํ• ์„ ํ•ด์ค€๋‹ค.

DUPLICATE KEY, ์ฆ‰ ์ค‘๋ณตํ‚ค(pk๋ฅผ ๋œปํ•จ)๊ฐ€ ์žˆ์œผ๋ฉด ์—…๋ฐ์ดํŠธ ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค.

-- ๊ทธ๋ž˜์„œ ์ด ๊ฒฝ์šฐ๋Š” id๊ฐ€ 1๋ฒˆ์ธ ๋ฐ์ดํ„ฐ๋Š” ์ด๋ฏธ ์žˆ์œผ๋‹ˆ name์ด 'ironMan'์—์„œ 'odin'์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
INSERT INTO test_220714(id, name)
VALUES('1', 'odin')
ON DUPLICATE KEY UPDATE
	name = 'odin'
;
-- ์ด ๊ฒฝ์šฐ๋Š” id๊ฐ€ 3๋ฒˆ์ธ ๋ฐ์ดํ„ฐ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์œผ๋‹ˆ 'xman'์ด insert ๋˜์—ˆ๋‹ค.
INSERT INTO test_220714
(id, name)
VALUES('3', 'xman')
ON DUPLICATE KEY UPDATE
	name = 'xman'
;

 

๋งŒ์ผ ์œ„์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ๋“ฑ๋ก/์ˆ˜์ •์„ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

  1.  ํ‚ค๊ฐ’์— ํ•ด๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์กด์žฌ์œ ๋ฌด ์ฒดํฌ SQL ์‹คํ–‰
  2.  ํ•ด๋‹น SQL์˜ ๊ฐ’์ด ์žˆ์œผ๋ฉด INSERT๋ฌธ, ์—†์œผ๋ฉด UPDATE๋ฌธ ์‹คํ–‰

๋ถˆ ํ•„์š”ํ•œ ์กด์žฌ์œ ๋ฌด ์ฒดํฌํ•˜๋Š” SQL์„ ํ•œ๋ฒˆ ๋” ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€, ๋น„ํšจ์œจ์ ์ธ ์ธก๋ฉด์ด ์ƒ๊ธด๋‹ค.

์‚ฌ์šฉํ•˜๋Š” DBMS์˜ ๋ฒ„์ „์ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์ด๊ฑฐ๋‚˜ ๊ทธ ์™ธ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด DUPLICATE KEY UPDATE...๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

mybatis์—์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

<insert id="insertMember" parameterType="MemberVO">
 INSERT INTO member
(
    id,
    name,
    email,
    regDate
)
VALUES
(
    #{id},
    #{name},
    #{email},
    now()
)
ON DUPLICATE KEY UPDATE
    name = #{name},
    email = #{email},
    updateDate = NOW()
</insert>

๊ฐœ์ธ ์Šคํ„ฐ๋”” ๊ธฐ๋ก์„ ๋ฉ”๋ชจํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ ํ‹€๋ฆฐ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‹€๋ฆฐ ์  ์žˆ์„ ๊ฒฝ์šฐ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋Œ“๊ธ€