수색…
소개
MERGE ( "update 또는 insert"의 경우 UPSERT라고도 함)는 새 행을 삽입하거나 행이 이미있는 경우 기존 행을 업데이트 할 수있게합니다. 요점은 전체 작업 집합을 원자 적으로 수행하여 데이터가 일관성있게 유지되도록하고 클라이언트 / 서버 시스템에서 여러 SQL 문의 통신 오버 헤드를 방지하는 것입니다.
타겟 일치 소스를 만들기위한 MERGE
MERGE INTO targetTable t
USING sourceTable s
ON t.PKID = s.PKID
WHEN MATCHED AND NOT EXISTS (
SELECT s.ColumnA, s.ColumnB, s.ColumnC
INTERSECT
SELECT t.ColumnA, t.ColumnB, s.ColumnC
)
THEN UPDATE SET
t.ColumnA = s.ColumnA
,t.ColumnB = s.ColumnB
,t.ColumnC = s.ColumnC
WHEN NOT MATCHED BY TARGET
THEN INSERT (PKID, ColumnA, ColumnB, ColumnC)
VALUES (s.PKID, s.ColumnA, s.ColumnB, s.ColumnC)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
;
참고 : AND NOT EXISTS
부분은 변경되지 않은 레코드를 업데이트하지 못하게합니다. INTERSECT
구조를 사용하면 특수 처리없이 널값 컬럼을 비교할 수 있습니다.
MySQL : 사용자 이름으로 계산
얼마나 많은 사용자가 같은 이름을 갖고 있는지 알고 싶다고 가정 해 봅시다. 다음과 같이 테이블 users
를 생성 해 보겠습니다.
create table users(
id int primary key auto_increment,
name varchar(8),
count int,
unique key name(name)
);
이제 우리는 조 (Joe)라는 새로운 사용자를 발견했으며 그를 고려하려고합니다. 이를 달성하기 위해서는 이름이있는 기존 행이 있는지 여부를 결정해야하며, 그렇다면 증분 값으로 업데이트해야합니다. 반면에 기존 행이 없다면 우리는 그것을 만들어야합니다.
MySQL은 다음 구문을 사용합니다 : insert ... on duplicate key update .... 이 경우 :
insert into users(name, count)
values ('Joe', 1)
on duplicate key update count=count+1;
PostgreSQL : 이름으로 사용자 계산하기
얼마나 많은 사용자가 같은 이름을 갖고 있는지 알고 싶다고 가정 해 봅시다. 다음과 같이 테이블 users
를 생성 해 보겠습니다.
create table users(
id serial,
name varchar(8) unique,
count int
);
이제 우리는 조 (Joe)라는 새로운 사용자를 발견했으며 그를 고려하려고합니다. 이를 달성하기 위해서는 이름이있는 기존 행이 있는지 여부를 결정해야하며, 그렇다면 증분 값으로 업데이트해야합니다. 반면에 기존 행이 없다면 우리는 그것을 만들어야합니다.
PostgreSQL은 다음 구문을 사용합니다 : insert ... conflict ... do update .... 이 경우 :
insert into users(name, count)
values('Joe', 1)
on conflict (name) do update set count = users.count + 1;