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;


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow