sintassi MERGE utilizzato per UPSERT o INSERT UPDATE duplicato
-
14-10-2019 - |
Domanda
Così sto venendo da MySQL dove ho potuto fare Inserisci il DUPLICATO UPDATE :
INSERT INTO table (a,b,c)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
Ma ora sto usando PostgreSQL e ci sono gli sforzi per aggiungere la funzionalità UPSERT, si presenta come forza lavoro di unione per quello che vorrei, ma volevo vedere se questa è la sintassi più ottimale. Esempio sintassi 1 , I've visto anche questo, ma non capisco come implementare . Non ho ancora provato questo perché ho pensato MERGE è stato utilizzato per la fusione dei dati provenienti da table1 a Table2 o sarebbe qualcosa di simile a questo lavoro?
MERGE
INTO table
USING table
ON c = 1
WHEN MATCHED THEN
UPDATE
SET c=c+1
WHEN NOT MATCHED THEN
INSERT (a,b,c)
VALUES (1,2,3)
Altri suggerimenti?
Soluzione
Fino MERGE è disponibile, utilizzare questo approccio robusto: Inserisci, aggiornata ogni duplicato in PostgreSQL?
Altri suggerimenti
Fino merge è supportato il modo più semplice è quello di rompere IMO appena in su in due query:
BEGIN;
INSERT INTO t (a,b,c) VALUES (1,2,3) WHERE id != 1;
UPDATE t SET c=c+1 WHERE id = 1;
END;
dove id sarebbe cambiato alla condizione appropriata.
MERGE INTO table
USING (VALUES (1, 2, 3)) AS newvalues (a, b, c)
ON table.c = newvalues.c -- or whatever the PK is
WHEN MATCHED THEN UPDATE SET c = c + 1
WHEN NOT MATCHED THEN INSERT (a, b, c)
VALUES (newvalues.a, newvalues.b, newvalues.c)
La chiave qui è che invece di fondere in un altro tavolo si crea una fonte costante tavolo utilizzando il costrutto VALUES
nella clausola USING
. Le regole esatte fusione è possibile, ovviamente, su misura per i gusti.
Vedi anche http://petereisentraut.blogspot.com/2010/05/ merge-syntax.html .
Credo "Merge" non è ancora in Postgres, ma si suppone sia in 9.1.
Mi piace usare REGOLA s invece
CREATE OR REPLACE RULE "insert_ignore"
AS ON INSERT TO "table" WHERE
NEW.id = OLD.id --whatever your conditions are
DO INSTEAD NOTHING;
Quello che avete collegato a ( "Inserisci, aggiornata ogni duplicato (PostgreSQL)") è fondamentalmente un po 'pgsql che si alimentano i dati. Credo che la regola è più elegante dal momento che non c'è bisogno di chiamarli in modo esplicito e trasparente funzionano in background senza la necessità di chiamare una procedura all'interno della vostra INSERT attuale.