使用“ ON CONFLICT”子句语义插入行的postgresql方式

|| 在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版(此刻为beta版)开始,您可以使用公用表表达式进行插入或替换:
/**
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部分     

要回复问题请先登录注册