Поиск…
Вступление
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;