URL テーブルがあります。それらが中に含んでいる
(id int 主キー、一意の URL 文字、さまざまなコンテンツ文字、最後に分析された日付)。
トリガーまたは何か(ルールである可能性があります)を作成したいので、Javaプログラムから挿入するたびに、そのようなURLを持つ行が存在する場合、単一の行が更新されます。それ以外の場合は、挿入を実行する必要があります。
Postgresql の完全なコードを提供してください。ありがとう。
URL テーブルがあります。それらが中に含んでいる
(id int 主キー、一意の URL 文字、さまざまなコンテンツ文字、最後に分析された日付)。
トリガーまたは何か(ルールである可能性があります)を作成したいので、Javaプログラムから挿入するたびに、そのようなURLを持つ行が存在する場合、単一の行が更新されます。それ以外の場合は、挿入を実行する必要があります。
Postgresql の完全なコードを提供してください。ありがとう。
これは何度も聞かれました。可能な解決策はここにあります: https://stackoverflow.com/a/6527838/552671
このソリューションには と の両方が必要UPDATE
です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);
Postgres 9.1 では、1 つのクエリで実行できます: https://stackoverflow.com/a/1109198/2873507
INSERTS
めったにない場合は、すべての更新NOT EXISTS (...)
で aSELECT
を発行するため、 a を実行しないようにします。代わりに、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
.
まずは挿入してみます。列に競合がある場合は、url
コンテンツと last_analyzed フィールドを更新します。更新がめったにない場合、これはより良いオプションかもしれません。
INSERT INTO URLs (url, content, last_analyzed)
VALUES
(
%(url)s,
%(content)s,
NOW()
)
ON CONFLICT (url)
DO
UPDATE
SET content=%(content)s, last_analyzed = NOW();