Postgresql,如果行存在一些唯一值,则更新,否则插入
我有一个网址表。 他们包含
(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,可以用一个查询来完成它:https://stackoverflow.com/a/8702291/552671
如果INSERTS
很少,我会避免做一个NOT EXISTS (...)
因为它会在所有更新中发出SELECT
。 相反,看看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
。
我发现这个帖子在这种情况下更相关:
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)
链接地址: http://www.djcxy.com/p/93951.html
上一篇: Postgresql, update if row with some unique value exists, else insert
下一篇: Postgresql triggers