MySQL-使用ON DUPLICATE KEY UPDATE将数据插入一个列,保留其他列

时间:2018-10-15 19:03:37

标签: mysql

我有一张桌子,可以说4个字段。

表: id(autoincremental),col1,col2,col3

有几行包含id,col1和col2的数据。

Col3为空。

我想用一个查询在现有行中用值填充col3,

INSERT INTO table(id, col3)
VALUES
(1, 'value1'),
(2, 'value2'),
(3, 'value3'),
...
ON DUPLICATE KEY UPDATE
id = VALUES(id),
col3 = VALUES(col3);

但是出现错误,因为col1和col2没有默认值。 我只想更新col3,并保留其他列值。 我该怎么办?

3 个答案:

答案 0 :(得分:1)

您可以使用一个简单的更新语句:

Update yourtable t
Set t.col3 = case when t.id = 1 then ‘value1’
                   case when t.id = 2 then ‘value2’
                    ..... 
                   else t.col3 end;

您还可以过滤所需的ID,以获得更好的性能

答案 1 :(得分:0)

您可以这样更新:

ON DUPLICATE KEY UPDATE
    col3 = VALUES(col3);

这将保留update语句中未包含的字段的当前值。


我再次阅读了问题,看来您的插入内容也需要col1和col2。您说他们没有默认值,所以我会

  • 为每个添加一个默认值
  • 将它们标记为可空
  • 使这些参数在您的应用程序中成为必需。

所以您不能更改表结构,我的最终查询如下:

INSERT INTO table(id, col1, col2, col3) VALUES
    (1, '', '', 'value1'),
    (2, '', '', 'value2'),
    (3, '', '', 'value3')
    --  ...
ON DUPLICATE KEY UPDATE
    col1 = col1,
    col2 = col2,
    col3 = VALUES(col3);

当字段没有默认值且不能为空时,插入查询 必须 包含该字段的值。因此,您的问题不在查询的更新部分,而在插入部分。

答案 2 :(得分:0)

我相信@Lukasz Szozda评论是解决此问题的最佳方法。因此,我将选择它作为解决方案。谢谢。

  

将col1,col2标记为可为空。