Postgresql, обновлять, если строка с некоторым уникальным значением существует, иначе вставить
У меня есть таблица URL. Они содержат
(первичный ключ id int,
символ url, отличающийся уникальным,
характер содержания изменяется,
последняя проанализированная дата).
Я хочу создать триггер или что-то (правило может быть), поэтому каждый раз, когда я делаю вставку из своей java-программы, он обновляет строку с одной строкой, если такой URL существует. Иначе он должен выполнить Insert.
Пожалуйста, можете ли вы предоставить полный код в Postgresql. Спасибо.
Ответы
Ответ 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
.