Eine sehr häufig gestellte Frage hier ist, wie man ein Upsert durchführt, was MySQL als INSERT ... ON DUPLICATE UPDATE
bezeichnet und was der Standard als Teil der MERGE
-Operation unterstützt.
Da PostgreSQL es nicht direkt unterstützt (vor pg 9.5), wie macht man das? Betrachten Sie das Folgende:
CREATE TABLE testtable (
id integer PRIMARY KEY,
somedata text NOT NULL
);
INSERT INTO testtable (id, somedata) VALUES
(1, 'fred'),
(2, 'bob');
Stellen Sie sich nun vor, Sie möchten die Tupel (2, 'Joe')
, (3, 'Alan')
"upserten", sodass der neue Tabelleninhalt wäre:
(1, 'fred'),
(2, 'Joe'), -- Wert des vorhandenen Tupels geändert
(3, 'Alan') -- Neues Tupel hinzugefügt
Das ist es, worüber die Leute sprechen, wenn sie über ein upsert
diskutieren. Wesentlich ist, dass jeder Ansatz sicher ist in Anbetracht mehrerer Transaktionen, die an der gleichen Tabelle arbeiten - entweder durch die Verwendung von expliziten Sperren oder anderweitiges Verteidigen gegen die resultierenden Rennbedingungen.
Dieses Thema wird ausführlich diskutiert unter Insert, on duplicate update in PostgreSQL?, aber das ist über Alternativen zur MySQL-Syntax und hat im Laufe der Zeit eine ziemliche Menge an nicht verwandten Details angesammelt. Ich arbeite an abschließenden Antworten.
Diese Techniken sind auch nützlich für "einfügen, wenn nicht vorhanden, ansonsten nichts tun", d.h. "insert ... on duplicate key ignore".