3

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如果它不需要自定义功能,我会更喜欢该规则。

4

2 回答 2

4

从 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' 是将被插入或替换的值。

它不适用于旧版本,您必须等待:-(

于 2011-05-04T08:46:24.770 回答
2

从 9.5 版开始,PostgreSQL 提供“UPSERT”功能。

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

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

于 2016-01-15T16:05:45.300 回答