수색…


소개

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;


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow