본문 바로가기
DataBase

[Database] Upsert란? DBMS 별 Upsert 예제

by 스파이디웹 2022. 6. 27.
728x90

1. Upsert(Update + Insert)란?

  • Upsert는 중복되는 값이 있다면 Update를 하고 중복되는 값이 없다면 Insert를 하는 쿼리
  • Unique Key의 값이 중복된다면 Update를 하고, Unique 컬럼의 값이 존재하지 않는다면 INSERT를 하는 것
  • Unique Key, 즉 중복되면 값이 있으면 안되는 컬럼에 추가하려는 데이터 값이 중복되지 않으면, INSERT 중복이 된다면, 중복의 대상이 되는 데이터 값을 UPDATE시키는 것(기준은 Unique Key 컬럼이다)

2. Upsert MySQL vs PostgreSQl

1. MySQL

INSERT INTO users (col1, col2) VALUES ('val1', 'val2') ON DUPLICATE KEY UPDATE col1='updateval1', col2='updateval2';

2. PostgreSQL(ver 9.5 이상)

INSERT INTO table1 (col1, col2)
VALUES ('val1', 'val2')
ON CONFLICT(col1, col2)
DO NOTHING;
--중복이 있을 경우 아무것도 안함.

INSERT INTO table1 (col1, col2)
VALUES ('val1', 'val2')
ON CONFLICT (UNIQUE KEY column) 
DO UPDATE
SET col2 = EXCLUDED.col2;
--중복이 있을 경우 UPDATE

3. MongoDB UPSERT

MongoDB의 update는 인자값은 총 4개

  1. 조건
  2. 변경조건
  3. upsert (기본값 false)
  4.  멀티라인 조건여부(기본값 false)

위의 3번 인자를 이용한 UPSERT가 가능합니다.

use test
db.test.drop();
db.test.insert({"idx": 1})
db.test.find();--//입력 결과 확인
--{ "_id" : ObjectId("50811cd4150da7bcd1e92041"), "idx" : 1 }
--//업데이트를 치면(upsert를 true를 줬으나 데이터가 있기 때문에 update)
db.test.update({"idx":1}, {$set : {"name":"eastluck"}}, true);
db.test.find();
--//수정 결과화면{ "_id" : ObjectId("50811cd4150da7bcd1e92041"), "idx" : 1, "name" : "eastluck" }

 

참조:

https://kkyunstory.tistory.com/38

https://tez.kr/161

https://mine-it-record.tistory.com/342

 

728x90

댓글