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;