在 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 版(此时为测试版)开始,您可以使用 common table expression进行插入或替换:
/**
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' 是将被插入或替换的值。
它在旧版本中不起作用,你必须等待 :-(
关于sql - postgresql 使用 "ON CONFLICT"子句语义插入行的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5874453/