Wie UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) in PostgreSQL?
Eine sehr häufig gestellte Frage ist hier, wie man ein Upsert macht, wie MySQL es nenntINSERT ... ON DUPLICATE UPDATE
und der Standard unterstützt als Teil derMERGE
Operation.
Wie gehen Sie vor, wenn PostgreSQL es nicht direkt unterstützt (vor S. 9.5)? Folgendes berücksichtigen:
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 "stürzen"(2, 'Joe')
, (3, 'Alan')
Der neue Tabelleninhalt wäre also:
(1, 'fred'),
(2, 'Joe'), -- Changed value of existing tuple
(3, 'Alan') -- Added new tuple
Das ist es, worüber die Leute reden, wenn sie über eine sprechenupsert
. Entscheidend muss jeder Ansatz seinsicher bei Vorhandensein mehrerer Transaktionen, die an derselben Tabelle arbeiten - Entweder durch explizites Sperren oder auf andere Weise durch Abwehr der daraus resultierenden Rennbedingungen.
Dieses Thema wird unter ausführlich behandeltBei doppeltem Update in PostgreSQL einfügen?Aber es geht um Alternativen zur MySQL-Syntax, und im Laufe der Zeit hat sich einiges an Detailfremdheit herausgebildet. Ich arbeite an endgültigen Antworten.
Diese Techniken sind auch nützlich für "Einfügen, wenn nicht vorhanden, andernfalls nichts tun", d. H. "Einfügen ... bei Ignorieren doppelter Schlüssel".