【问题标题】:Separate ON CONFLICT for each inserted row为每个插入的行单独的 ON CONFLICT
【发布时间】:2020-12-08 15:47:00
【问题描述】:

我有下一个不起作用的查询:

INSERT INTO some_table (id, data, type_id) 
          VALUES (12, 'text', 4)
          ON CONFLICT(id, type_id) DO UPDATE SET data = 'www',
          (11, 'ooo', 4)
          ON CONFLICT(id, type_id) DO UPDATE SET level = 'kkk'

如何为每个插入的行添加单独的 ON CONFLICT?

【问题讨论】:

    标签: sql postgresql sql-update case sql-insert


    【解决方案1】:

    您可以在 SET 部分使用 CASE 表达式:

    INSERT INTO some_table (id, data, type_id) 
    VALUES (12, 'text', 4), (11, 'ooo', 4)
    ON CONFLICT(id, type_id) DO UPDATE 
      SET data = case 
                   when excluded.id = 12 then 'www'
                   when excluded.id = 11 then 'kkk'
                 end
    

    【讨论】:

    • 有一个问题,实际上我正在使用 JS map() 函数来构建这样的查询。因此,每次迭代后,所有数据都将被复制/粘贴。所以很难有唯一的 ON CONFLICT(id, type_id) DO UPDATE SET
    【解决方案2】:

    您可以使用case 表达式来做到这一点。有点麻烦,因为要更新不同的列,但是逻辑是:

    INSERT INTO some_table (id, data, type_id) 
    VALUES (12, 'text', 4), (11, 'ooo', 4)
    ON CONFLICT(id, type_id) DO UPDATE SET 
        data  = CASE WHEN id = 12 THEN 'www' ELSE data END,
        level = CASE WHEN id = 11 THEN 'kkk' ELSE level END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多