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
我正在搜索类似 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