2012-06-21 60 views
23

我有一个URL表。它们包含Postgresql,如果行存在一些唯一值,则更新,否则插入

(ID INT主键, 网址字符改变独特, 内容字符改变, 最后分析日期)。

我想创建触发器或某些东西(规则可能),所以每次我从我的java程序插入,它会更新一些单行如果存在这样的URL的行。否则它应该执行插入。

请问您能提供Postgresql的完整代码吗?谢谢。

+1

的可能重复[!PostgreSQL的INSERT,如果特定的行名行不存在(http://stackoverflow.com/questions/5297045/postgresql-插入 - 如果特定 - 行名 - 不存在) –

+0

这些都是垃圾问题。 –

回答

45

这已被问了很多次。一个可能的解决方案可以在这里找到: https://stackoverflow.com/a/6527838/552671

此解决方案需要一个UPDATEINSERT

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

2

如果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

1

我发现this post在这种情况下更相关:

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) 
相关问题