2012-06-21 6 views
23

Ho una tabella URL. Essi contengonoPostgresql, aggiorna se esiste una riga con qualche valore univoco, altrimenti inserisci

(id int chiave primaria, url character varying unico, carattere contenuto variabile, ultima data analizzati).

Voglio creare trigger o qualcosa (la regola può essere), quindi ogni volta che faccio inserto dal mio programma java, aggiorna qualche riga singola se esiste una riga con tale URL. Altrimenti dovrebbe eseguire un inserimento.

Si prega di fornire un codice completo in Postgresql. Grazie.

+1

possibile duplicato del [! INSERT POSTGRESQL se uno specifico nome di fila Non esiste] (http://stackoverflow.com/questions/5297045/postgresql- insert-if-specific-row-name-dont-exists) –

+0

Queste sono entrambe domande di merda. –

risposta

45

Questo è stato chiesto molte volte. Una possibile soluzione può essere trovata qui: https://stackoverflow.com/a/6527838/552671

Questa soluzione richiede sia un UPDATE e INSERT.

UPDATE table SET field='C', field2='Z' WHERE id=3; 
INSERT INTO table (id, field, field2) 
     SELECT 3, 'C', 'Z' 
     WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3); 

Con Postgres 9.1 è possibile farlo con una query: https://stackoverflow.com/a/8702291/552671

2

Se INSERTS sono rari, vorrei evitare di fare un NOT EXISTS (...) in quanto emette un SELECT su tutti gli aggiornamenti. Invece, dare un'occhiata a wildpeaks risposta: https://dba.stackexchange.com/questions/5815/how-can-i-insert-if-key-not-exist-with-postgresql

CREATE OR REPLACE FUNCTION upsert_tableName(arg1 type, arg2 type) RETURNS VOID AS $$ 
    DECLARE 
    BEGIN 
     UPDATE tableName SET col1 = value WHERE colX = arg1 and colY = arg2; 
     IF NOT FOUND THEN 
     INSERT INTO tableName values (value, arg1, arg2); 
     END IF; 
    END; 
    $$ LANGUAGE 'plpgsql'; 

In questo modo Postgres inizialmente cercare di fare un UPDATE. Se nessuna riga è stata interessata, ritornerà ad emettere un INSERT.

1

ho trovato this post più rilevante in questo scenario:

WITH upsert AS (
    UPDATE spider_count SET tally=tally+1 
    WHERE date='today' AND spider='Googlebot' 
    RETURNING * 
) 
INSERT INTO spider_count (spider, tally) 
SELECT 'Googlebot', 1 
WHERE NOT EXISTS (SELECT * FROM upsert)