Szukaj…
Wprowadzenie
MERGE (często nazywany również UPSERT dla „update or insert”) pozwala wstawić nowe wiersze lub, jeśli wiersz już istnieje, zaktualizować istniejący wiersz. Chodzi o to, aby wykonać cały zestaw operacji atomowo (aby zagwarantować, że dane pozostaną spójne) i aby uniknąć narzutu komunikacyjnego dla wielu instrukcji SQL w systemie klient / serwer.
POŁĄCZ, aby Cel był dopasowany do źródła
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
;
Uwaga: Część AND NOT EXISTS
zapobiega aktualizacji rekordów, które nie uległy zmianie. Korzystanie z konstrukcji INTERSECT
pozwala na porównywanie zerowalnych kolumn bez specjalnej obsługi.
MySQL: liczenie użytkowników według nazwy
Załóżmy, że chcemy wiedzieć, ilu użytkowników ma tę samą nazwę. Utwórzmy users
tabeli w następujący sposób:
create table users(
id int primary key auto_increment,
name varchar(8),
count int,
unique key name(name)
);
Właśnie odkryliśmy nowego użytkownika o imieniu Joe i chcielibyśmy go wziąć pod uwagę. Aby to osiągnąć, musimy ustalić, czy istnieje wiersz z jego nazwiskiem, a jeśli tak, zaktualizuj go, aby zwiększyć liczbę; z drugiej strony, jeśli nie ma istniejącego wiersza, powinniśmy go utworzyć.
MySQL wykorzystuje następującą składnię: insert… przy zduplikowanej aktualizacji klucza… . W tym przypadku:
insert into users(name, count)
values ('Joe', 1)
on duplicate key update count=count+1;
PostgreSQL: liczenie użytkowników według nazwy
Załóżmy, że chcemy wiedzieć, ilu użytkowników ma tę samą nazwę. Utwórzmy users
tabeli w następujący sposób:
create table users(
id serial,
name varchar(8) unique,
count int
);
Właśnie odkryliśmy nowego użytkownika o imieniu Joe i chcielibyśmy go wziąć pod uwagę. Aby to osiągnąć, musimy ustalić, czy istnieje wiersz z jego nazwiskiem, a jeśli tak, zaktualizuj go, aby zwiększyć liczbę; z drugiej strony, jeśli nie ma istniejącego wiersza, powinniśmy go utworzyć.
PostgreSQL używa następującej składni: wstaw… w przypadku konfliktu… zaktualizuj… W tym przypadku:
insert into users(name, count)
values('Joe', 1)
on conflict (name) do update set count = users.count + 1;