2012-06-21 4 views
23
を挿入します。

私はURLテーブルを持っています。それらは、Postgresqlは、一意の値を持つ行が存在する場合は更新し、そうでない場合は

(id intプライマリキー、 ユニークなURL文字、のコンテンツ文字、 、最後に分析された日付)を含みます。

私は自分のJavaプログラムから挿入するたびに、そのようなURLを持つ行が存在する場合、いくつかの単一の行を更新するので、トリガーなどを作成したい(ルールの可能性があります)。それ以外の場合は挿入を実行する必要があります。

PostgreSQLで完全なコードを提供できますか。ありがとう。

+1

が重複する可能性を(http://stackoverflow.com/questions/5297045/postgresql- insert-if-specific-row-name-dont-exists) –

+0

これは両方とも疑問な質問です。 –

答えて

45

これは何度も尋ねられています。考えられる解決策は次のとおりです。 https://stackoverflow.com/a/6527838/552671

このソリューションでは、UPDATEINSERTの両方が必要です。 Postgresの9.1

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); 

1つのクエリでそれを行うことが可能である: https://stackoverflow.com/a/8702291/552671

2

INSERTSは稀であるならば、それはすべての更新にSELECTを放射するので、私はNOT EXISTS (...)をやって避けるだろう。その代わり、wildpeaksを見て答える: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'; 

Postgresは最初にUPDATEをしようとします。この道を。影響を受けた行がない場合は、INSERTを出力します。

1

私はthis postこのシナリオでは、より関連性が見つかりました:[特定の行名が存在しない場合は、PostgreSQLのINSERT!]の

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) 
関連する問題