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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top