sql - postgresql 使用 "ON CONFLICT"子句语义插入行的方法

标签 sql postgresql insert-update upsert

在 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/

相关文章:

c# - 修改sql查询,不想使用join操作

sql - 错误: "coalesce" is not a known variable in INTO clause

PostgreSQL 函数遍历查询,如何返回表

mysql - 无法从多个表中删除

c# - 在 IQueryable 上执行文本 SQL 查询

postgresql - 使用 psql,如何使 '\d {tableName}' 的输出保留在控制台中?

sql - 在 PostgreSQL 中计算累积和

php - 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

php - INSERT INTO table2 SELECT FROM table1 然后 UPDATE table1 所选/插入的行

java - 计算 INSERT/ON DUPLICATE KEY UPDATE