2012-06-21 8 views
23

Ich habe eine URL-Tabelle. Sie enthaltenPostgresql, Update, wenn Zeile mit einem eindeutigen Wert existiert, sonst einfügen

(id int Primärschlüssel, url unterschiedlichen Charakter einzigartig, Inhalt unterschiedlichen Charakter, zuletzt analysiert Datum).

Ich möchte Trigger oder etwas (Regel kann sein), so dass jedes Mal, wenn ich einfügen von meinem Java-Programm, aktualisiert es einzelne Zeile, wenn Zeile mit einer solchen URL existiert. Sonst sollte es einen Insert durchführen.

Bitte, können Sie einen vollständigen Code in Postgresql bereitstellen. Vielen Dank.

+1

möglich Duplikat [! POSTGRESQL INSERT, wenn bestimmte Zeilenname nicht existiert tun] (http://stackoverflow.com/questions/5297045/postgresql- insert-if-specific-row-name-dont-exists) –

+0

Dies sind beide Mistfragen. –

Antwort

45

Dies wurde oft gefragt. Eine mögliche Lösung finden Sie hier: https://stackoverflow.com/a/6527838/552671

Diese Lösung erfordert eine UPDATE und 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); 

Mit Postgres 9.1 ist es möglich, es mit einer Abfrage zu tun: https://stackoverflow.com/a/8702291/552671

2

Wenn INSERTS selten sind, würde ich vermeiden, dass ein NOT EXISTS (...) tun, da es ein SELECT auf alle Updates emittiert. Stattdessen nehmen Sie einen Blick auf wildpeaks Antwort: 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'; 

Auf diese Weise Postgres wird zunächst versuchen, eine UPDATE zu tun. Wenn keine Zeilen betroffen sind, wird auf INSERT zurückgesetzt.

1

Ich fand this post mehr in diesem Szenario relevant:

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) 
Verwandte Themen