【问题标题】:UPSERT for "INSERT INTO tab SELECT * FROM another_tab"UPSERT for "INSERT INTO tab SELECT * FROM another_tab"
【发布时间】:2020-07-13 19:37:48
【问题描述】:

从另一个表插入多行时,我将如何在 SQLite 表中执行“UPSERT”(插入或更新)

我试过了:

INSERT INTO tab_name
SELECT * FROM tmp
ON CONFLICT(id)
    DO UPDATE SET
      val = excluded.val;

但它给了我:

“DO”附近的语法错误

实现这一目标的正确和最有效的方法是什么?

【问题讨论】:

    标签: sql sqlite select sql-update sql-insert


    【解决方案1】:

    您可能遇到了一个名为 parsing ambiguity 的记录陷阱:

    UPSERT 附加到的INSERT 语句从SELECT 语句中获取其值时,可能存在解析歧义。解析器可能无法判断 "ON" 关键字是否引入了 UPSERT 或者它是否是连接的 ON 子句。要解决此问题,SELECT 语句应始终包含WHERE 子句,即使该WHERE 子句只是"WHERE true"。)

    那么,这样效果更好吗?

    INSERT INTO tab_name
    SELECT * FROM tmp WHERE true
    ON CONFLICT(id) DO UPDATE SET val = excluded.val;
    

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 2022-08-02
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      相关资源
      最近更新 更多