在一个列中插入数据,保留其他列,并更新重复的密钥

uwopmtnx  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(204)

我有一张有4个字段的table。
表:id(自动增量)、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,并保留其他列值。我该怎么办?

jgwigjjp

jgwigjjp1#

我相信@lukasz szozda评论是解决这个问题的最佳方法。所以我会选择它作为解决方案。谢谢。
将col1、col2标记为可空。

tag5nh1u

tag5nh1u2#

您可以这样更新:

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);

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

67up9zun

67up9zun3#

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

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以获得更好的性能

相关问题