Подтвердить что ты не робот

Postgresql, обновлять, если строка с некоторым уникальным значением существует, иначе вставить

У меня есть таблица URL. Они содержат

(первичный ключ id int,  символ url, отличающийся уникальным, характер содержания изменяется, последняя проанализированная дата).

Я хочу создать триггер или что-то (правило может быть), поэтому каждый раз, когда я делаю вставку из своей java-программы, он обновляет строку с одной строкой, если такой URL существует. Иначе он должен выполнить Insert.

Пожалуйста, можете ли вы предоставить полный код в Postgresql. Спасибо.

4b9b3361

Ответ 1

Об этом много раз спрашивали. Возможное решение можно найти здесь: fooobar.com/questions/15122/...

Это решение требует как 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 это можно сделать одним запросом: fooobar.com/questions/15122/...

Ответ 2

Я нашел этот пост более актуальным в этом сценарии:

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)

Ответ 3

Если INSERTS редки, я бы избегал делать NOT EXISTS (...), поскольку он испускает SELECT для всех обновлений. Вместо этого взгляните на ответ на wildpeaks: https://dba.stackexchange.com/info/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.