)
在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部分