【问题标题】: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;