【问题标题】:Postgresql: UPSERT / INSERT INTO defining a conflictPostgresql:UPSERT / INSERT INTO 定义冲突
【发布时间】:2020-02-29 21:05:56
【问题描述】:

这是我在平台上的第一篇文章。

我希望this image 解释我想要做什么。 我正在尝试将表 B 合并到表 A 中。如果满足 (A.cell = B.cell AND A.object = B.objet) 的条件,那么我想用表 B 中的相应成本更新 A.cost。如果条件不满足,我想将B中的行插入A中。

到目前为止,我尝试过的是一个 upsert,但它没有用:

INSERT INTO reached_points
SELECT B.cell_id, B.object_id, B.reached_cost
FROM test_reached_cells B
ON CONFLICT (cell_id, object_id)
WHERE (cell_id = B.cell_id AND object_id = B.object_id)
DO UPDATE SET cost = B.reached_cost

我认为在 CONFLICT 之后的 WHERE 子句中,我可以定义何时“触发”该冲突。不是这样吗?我是这么认为的,因为在 documentation 中它说类似“[ON CONFLICT 目标操作;] 目标可以是:WHERE 谓词 – 带有谓词的 WHERE 子句”。

有没有办法实现更新,如果条件不满足,插入?我想避免在两个完全独立的步骤中执行此操作,因为两次比较表格似乎效率低下。

【问题讨论】:

    标签: sql postgresql sql-update sql-insert


    【解决方案1】:

    我认为在 CONFLICT 之后的 WHERE 子句中,我可以定义何时“触发”该冲突。不是这样吗?

    没有。定义冲突的是target,即紧跟ON CONFLICT 关键字的表达式。在您的查询中,即:

    on conflict(cell_id, object_id)
    

    ...这是您想要的 - 请注意,这要求您在此列元组上具有唯一索引(或主键约束)。所以你不需要(也不想要)这个where 子句。

    另外,要在do update 子句中访问另一个表中的列,您可以使用伪表excluded

    考虑:

    insert into reached_points(cell_id, object_id, cost)
    select cell_id, object_id, reached_cost from test_reached_cells
    on conflict(cell_id, object_id)
    do update set cost = excluded.cost
    

    Demo on DB Fiddle

    样本数据:

    select * from reached_points;
    
    cell_id | object_id |成本 ------: | --------: | ---: 1 | 2 | 3
    select * from test_reached_cells;
    
    cell_id | object_id |到达成本 ------: | --------: | ------------: 1 | 2 | 4 1 | 3 | 4

    查询:

    insert into reached_points(cell_id, object_id, cost)
    select cell_id, object_id, reached_cost from test_reached_cells
    on conflict(cell_id, object_id)
    do update set cost = excluded.cost
    -- 2 rows affected
    

    结果:

    select * from reached_points;
    
    cell_id | object_id |成本 ------: | --------: | ---: 1 | 2 | 4 1 | 3 | 4

    【讨论】:

      猜你喜欢
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2010-10-26
      • 2019-03-22
      • 2012-07-06
      相关资源
      最近更新 更多