首页 文章

Postgresql,如果存在具有某些唯一值的行,则更新,否则插入

提问于
浏览
29

我有一个URL表 . 他们包含

(id int主键,url字符变化唯一,内容字符变化,最后分析日期) .

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

请你能在Postgresql中提供完整的代码吗?谢谢 .

3 回答

  • 53

    这已被问过很多次了 . 可在此处找到可能的解决方案: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

  • 4

    我在这种情况下发现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)
    
  • 5

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

相关问题