使用单独的更新列插入重复键更新批次
insert on duplicate key update batch with separate update columns
我有这样一种情况,我有一个 table (col1 (pk), col2, col3, col4)
和一组记录,我需要将它们插入到 table 中,并在重复键上更新它们。我想做一个批量查询来加快速度。但是,col4
没有 NOT NULL
约束。当我想更新记录 (val1, val2, val3, None), (val4, val5, val6, val7)
时,问题就出现了。对于第一条记录,我不希望更新第 4 列(如果数据库中存在 (val1, val2, val3, val8)
,我不想覆盖 val8,因为 None 表示缺少值,而不是显式设置为无效的)。但是,对于第二条记录,我想更新 col4
因为传递了一个显式值。这对于一条记录来说没问题,我只需将更新列设置为 col2, col3,
而不是 col4
,但我想批处理此查询并且需要 col4
update 时为它传递值,当我没有值时不更新。从逻辑上讲,我需要下面给出的东西。
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('val1', 'val2', 'val3'), ON DUP KEY UPDATE col2, col3
('val5', 'val6', 'val7', 'val8'), ON DUP KEY UPDATE col2, col3, col4
('val9', 'val10', 'val11') ON DUP KEY UPDATE col2, col3
很明显,这可以通过将其设为一系列单独的语句来完成,但我想找到一种方法来对其进行批处理。有什么办法可以在 sql?
中完成此操作或其他方法
VALUES 中的字段数必须与 INSERT 中的字段数相同。但是您可以只为 col4
传递 NULL
并在 UPDATE 部分使用 COALESCE。
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('val1', 'val2', 'val3', NULL),
('val5', 'val6', 'val7', 'val8'),
('val9', 'val10', 'val11', NULL)
ON DUPLICATE KEY UPDATE
col2 = VALUES(col2),
col3 = VALUES(col3),
col4 = COALESCE(VALUES(col4), col4)
这是您要找的东西吗?
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('val1', 'val2', 'val3', null)
('val5', 'val6', 'val7', 'val8')
('val9', 'val10', 'val11', null)
ON DUPLICATE KEY UPDATE
col2 = values(col2),
col3 = values(col3),
col4 = coalesce(values(col4), col4)
;
在插入的on duplicate key update
部分,可以用values
引用插入的值。在 null
:
的情况下,您可以使用 coalesce
来保留 pre-update 值
INSERT INTO YourTable (col1, col2, col3, col4) VALUES
('val1', 'val2', 'val3', null)
, ('val5', 'val6', 'val7', 'val8')
, ('val9', 'val10', 'val11', null)
ON DUPLICATE KEY UPDATE
col1 = values(col1)
, col2 = values(col2)
, col3 = values(col3)
, col4 = coalesce(values(col4), col4)
在回复您的评论时,您可以使用 case
:
明确设置 null
, col4 = case values(col4)
when 'None' then null
else coalesce(values(col4), col4)
end
这里明显的风险是您无法再更新到 None :)
我有这样一种情况,我有一个 table (col1 (pk), col2, col3, col4)
和一组记录,我需要将它们插入到 table 中,并在重复键上更新它们。我想做一个批量查询来加快速度。但是,col4
没有 NOT NULL
约束。当我想更新记录 (val1, val2, val3, None), (val4, val5, val6, val7)
时,问题就出现了。对于第一条记录,我不希望更新第 4 列(如果数据库中存在 (val1, val2, val3, val8)
,我不想覆盖 val8,因为 None 表示缺少值,而不是显式设置为无效的)。但是,对于第二条记录,我想更新 col4
因为传递了一个显式值。这对于一条记录来说没问题,我只需将更新列设置为 col2, col3,
而不是 col4
,但我想批处理此查询并且需要 col4
update 时为它传递值,当我没有值时不更新。从逻辑上讲,我需要下面给出的东西。
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('val1', 'val2', 'val3'), ON DUP KEY UPDATE col2, col3
('val5', 'val6', 'val7', 'val8'), ON DUP KEY UPDATE col2, col3, col4
('val9', 'val10', 'val11') ON DUP KEY UPDATE col2, col3
很明显,这可以通过将其设为一系列单独的语句来完成,但我想找到一种方法来对其进行批处理。有什么办法可以在 sql?
中完成此操作或其他方法VALUES 中的字段数必须与 INSERT 中的字段数相同。但是您可以只为 col4
传递 NULL
并在 UPDATE 部分使用 COALESCE。
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('val1', 'val2', 'val3', NULL),
('val5', 'val6', 'val7', 'val8'),
('val9', 'val10', 'val11', NULL)
ON DUPLICATE KEY UPDATE
col2 = VALUES(col2),
col3 = VALUES(col3),
col4 = COALESCE(VALUES(col4), col4)
这是您要找的东西吗?
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('val1', 'val2', 'val3', null)
('val5', 'val6', 'val7', 'val8')
('val9', 'val10', 'val11', null)
ON DUPLICATE KEY UPDATE
col2 = values(col2),
col3 = values(col3),
col4 = coalesce(values(col4), col4)
;
在插入的on duplicate key update
部分,可以用values
引用插入的值。在 null
:
coalesce
来保留 pre-update 值
INSERT INTO YourTable (col1, col2, col3, col4) VALUES
('val1', 'val2', 'val3', null)
, ('val5', 'val6', 'val7', 'val8')
, ('val9', 'val10', 'val11', null)
ON DUPLICATE KEY UPDATE
col1 = values(col1)
, col2 = values(col2)
, col3 = values(col3)
, col4 = coalesce(values(col4), col4)
在回复您的评论时,您可以使用 case
:
null
, col4 = case values(col4)
when 'None' then null
else coalesce(values(col4), col4)
end
这里明显的风险是您无法再更新到 None :)