2

我有一种情况,我有一个表(col1 (pk), col2, col3, col4)和一组记录,我需要将它们插入到表中并在重复键上更新它们。我想做一个批处理查询来加快速度。但是,col4没有NOT NULL约束。当我想用记录更新时出现问题(val1, val2, val3, None), (val4, val5, val6, val7)。对于第一条记录,我不希望更新第 4 列(如果(val1, val2, val3, val8)存在于 DB 中,我不想覆盖 val8,因为 None 表示缺少值,而不是显式设置为 Null)。但是,对于第二条记录,我想更新col4,因为传递了一个显式值。这对于我只需将更新列设置为col2, col3,而不是的一条记录就可以了col4,但我想批量处理这个查询并且需要col4为它传递值时更新,当我没有值时不更新。我在逻辑上需要下面给出的东西。

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 中完成此操作或其他方法吗?

4

3 回答 3

1

VALUES 中的字段数必须与 INSERT 中的相同。但是您可以在 UPDATE 部分传递NULLcol4使用 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)
于 2018-03-24T19:26:56.037 回答
1

这是你要找的东西吗?

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)
;
于 2018-03-24T19:27:14.823 回答
1

on duplicate key update插入部分,您可以使用 引用插入的值values。在以下情况下,您可以使用coalesce保留更新前的值null

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)

SQL Fiddle 上的示例。

在回复您的评论时,您可以null明确设置case

,   col4 = case values(col4) 
           when 'None' then null 
           else coalesce(values(col4), col4)
           end

这里明显的风险是您不能再更新为 None :)

于 2018-03-24T19:27:28.383 回答