Поиск…


Вступление

MERGE (часто также называемый UPSERT для «обновления или вставки») позволяет вставлять новые строки или, если строка уже существует, обновлять существующую строку. Суть заключается в том, чтобы выполнить весь набор операций атомарно (чтобы гарантировать, что данные остаются согласованными) и предотвращать накладные расходы на связь для нескольких операторов SQL в системе клиент / сервер.

MERGE, чтобы создать Target match Source

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 позволяет сравнивать столбцы с INTERSECT значениями без специальной обработки.

MySQL: подсчет пользователей по имени

Предположим, мы хотим знать, сколько пользователей имеют одно и то же имя. Давайте создадим users таблицы следующим образом:

create table users(
    id int primary key auto_increment,
    name varchar(8),
    count int,
    unique key name(name)
);

Теперь мы просто обнаружили нового пользователя по имени Джо и хотели бы его принять во внимание. Для этого нам нужно определить, существует ли существующая строка с его именем, и если да, обновите ее, чтобы увеличить счетчик; с другой стороны, если нет существующей строки, мы должны ее создать.

MySQL использует следующий синтаксис: insert ... при дублировании ключевого обновления .... В этом случае:

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
);

Теперь мы просто обнаружили нового пользователя по имени Джо и хотели бы его принять во внимание. Для этого нам нужно определить, существует ли существующая строка с его именем, и если да, обновите ее, чтобы увеличить счетчик; с другой стороны, если нет существующей строки, мы должны ее создать.

PostgreSQL использует следующий синтаксис: insert ... on 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