SQLite:有没有办法进行多行更新?

SQLite: Is there a way for multiline upsert?

我正在搜索类似 upsert 的多行。 假设我有以下 SQLite 模式,仅包含一个 ID 和许多整数:

    CREATE TABLE table (ID INT PRIMARY KEY, A INT, ..., Z INT);

如果我想插入一些整数 A、B 和 C 并保留其余的,我可以像这样使用 Upsert:

    INSERT INTO table (ID, A, B, C)
        VALUES (2, 4, 6, 8)
        ON CONFLICT (ID)
        DO UPDATE SET A=excluded.A, B=excluded.B, C=excluded.C;

如果我有很多行要插入(我有几千行),我可以像这样使用多行插入:

    INSERT INTO table (ID, A, B, C)
        VALUES (2, 4, 6, 8),
        ...,
        VALUES (1002, 5, 7, 9);

但是有没有办法将这两种可能性结合起来呢?类似于:

    INSERT INTO table (ID, A, B, C)
        VALUES (2, 4, 6, 8) ON CONFLICT (ID) DO UPDATE SET A=excluded.A, B=excluded.B, C=excluded.C,
        ...,
        VALUES (1002, 5, 7, 9) ON CONFLICT (ID) DO UPDATE SET A=excluded.A, B=excluded.B, C=excluded.C;

此外,有什么方法可以删除或缩短列表 ...SET A=excluded.A, B=excluded.B, C=excluded.C;?如果还没有条目,我总是想替换我要插入的所有值。但如果已经有一个带有 ID 的条目,我也会保留所有其他条目(D 到 Z)。

非常感谢。

而不是 INSERT...VALUES 使用 INSERT...SELECT:

INSERT INTO tablename (ID, A, B, C)
SELECT 2, 4, 6, 8 UNION ALL
SELECT 1002, 5, 7, 9
ON CONFLICT (ID) DO UPDATE 
SET A=excluded.A, B=excluded.B, C=excluded.C

或:

SET (A, B, C)=(excluded.A, excluded.B, excluded.C)

或者用 ROW VALUES 代替 UNION ALL:

WITH cte AS (VALUES (2, 4, 6, 9), (1002, 5, 7, 10))
INSERT INTO tablename (ID, A, B, C)
SELECT * 
FROM cte
WHERE 1
ON CONFLICT (ID) DO UPDATE 
SET A=excluded.A, B=excluded.B, C=excluded.C