Suche…


Einführung

MERGE (oft auch UPSERT für "Update or Insert" genannt) ermöglicht das Einfügen neuer Zeilen oder, falls bereits eine Zeile vorhanden ist, die vorhandene Zeile zu aktualisieren. Es geht darum, den gesamten Satz von Operationen atomar auszuführen (um sicherzustellen, dass die Daten konsistent bleiben) und um den Kommunikationsaufwand für mehrere SQL-Anweisungen in einem Client / Server-System zu verhindern.

MERGE, um das Ziel mit der Quelle zu verbinden

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
    ;

Hinweis: Der Abschnitt AND NOT EXISTS verhindert die Aktualisierung von Datensätzen, die nicht geändert wurden. Durch die Verwendung des INTERSECT Konstrukts können nullfähige Spalten ohne besondere Behandlung verglichen werden.

MySQL: Benutzer nach Namen zählen

Angenommen, wir möchten wissen, wie viele Benutzer denselben Namen haben. Lassen Sie uns Tabelle erstellen users wie folgt:

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

Wir haben gerade einen neuen Benutzer namens Joe entdeckt und möchten ihn gerne berücksichtigen. Um dies zu erreichen, müssen wir feststellen, ob eine Zeile mit seinem Namen vorhanden ist. Wenn ja, aktualisieren Sie sie, um die Anzahl zu erhöhen. Wenn es jedoch keine Zeile gibt, sollten wir sie erstellen.

MySQL verwendet die folgende Syntax: insert… bei Duplikatschlüssel-Update… . In diesem Fall:

insert into users(name, count)
       values ('Joe', 1)
       on duplicate key update count=count+1;

PostgreSQL: Benutzer nach Namen zählen

Angenommen, wir möchten wissen, wie viele Benutzer denselben Namen haben. Lassen Sie uns Tabelle erstellen users wie folgt:

create table users(
    id serial,
    name varchar(8) unique,
    count int
);

Wir haben gerade einen neuen Benutzer namens Joe entdeckt und möchten ihn gerne berücksichtigen. Um dies zu erreichen, müssen wir feststellen, ob eine Zeile mit seinem Namen vorhanden ist. Wenn ja, aktualisieren Sie sie, um die Anzahl zu erhöhen. Wenn es jedoch keine Zeile gibt, sollten wir sie erstellen.

PostgreSQL verwendet die folgende Syntax: insert ... in Konflikt ... Aktualisierung In diesem Fall:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow