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".

Antworten auf die Frage(6)

Ihre Antwort auf die Frage