PostgreSQL 使用"ON CONFLICT"子句语义插入行的方法



在postgres中是否有一种简单的方法可以在sqlite中执行以下等效操作?

INSERT INTO foo (x, y, z) VALUES (1, 2, 3) ON CONFLICT replace;

我已经环顾四周,我找到的解决方案是复杂的自定义函数。我的问题的另一个解决方案是执行

delete from foo where x=1; INSERT INTO foo (x, y, z) VALUES (1, 2, 3) ON CONFLICT replace;

在语义上不相等,但对我的情况有效。

如果不需要自定义函数,我更喜欢ON CONFLICT规则。

在PostgreSQL 9.1版本(目前是测试版)中,您可以使用一个通用的表表达式来执行插入或替换操作:

/**
CREATE TABLE foo(id serial primary key, content text unique);
**/
WITH replace AS (
    DELETE FROM foo
    WHERE
        content = 'bar'
    RETURNING content
)
INSERT INTO 
    foo(content) -- values:
SELECT
    *
FROM replace RIGHT JOIN (SELECT CAST('bar' AS text) as content) sub USING(content);

'bar'是要插入或替换的值。

旧版本无法使用,您必须等待:-(

)

从9.5版本开始,PostgreSQL提供了"UPSERT"功能。

http://www.postgresql.org/docs/current/static/sql-insert.html

注意命令概要中的ON CONFLICT部分

最新更新