如何用SQL批量更新已有记录的指定空字段且不覆盖原有数据
解决方案
你原先使用的INSERT语句作用是新增数据,自然会产生新记录,要修改已存在的行数据,应该使用UPDATE相关语法,两种常用实现方案如下:
方案1:批量更新(所有行H-K值相同)
如果285条记录的H到K列填充的值完全一致,直接执行单条UPDATE语句即可,不会修改A-G列内容:
UPDATE `table` SET colH = '你的H列统一值', colI = '你的I列统一值', colJ = '你的J列统一值', colK = '你的K列统一值' -- 可选加WHERE条件,只修改H-K为空的行,避免误改其他数据 WHERE colH IS NULL AND colI IS NULL AND colJ IS NULL AND colK IS NULL;
方案2:逐行更新(每行H-K值不同)
如果每条记录的H-K列值都不一样,有两种实现方式:
方式A:多条UPDATE语句
为每个record_id写独立的UPDATE语句:
-- 第1条记录 UPDATE `table` SET colH = 'H值1', colI = 'I值1', colJ = 'J值1', colK = 'K值1' WHERE record_id = 1; -- 第2条记录 UPDATE `table` SET colH = 'H值2', colI = 'I值2', colJ = 'J值2', colK = 'K值2' WHERE record_id = 2; -- 以此类推直到第285条 UPDATE `table` SET colH = 'H值285', colI = 'I值285', colJ = 'J值285', colK = 'K值285' WHERE record_id = 285;
方式B:INSERT ... ON DUPLICATE KEY UPDATE(复用你原有VALUES内容)
如果不想写285条UPDATE语句,并且record_id是表的主键/唯一索引,可以用这种写法,几乎不用修改你原先准备的VALUES列表:
INSERT INTO `table` (`record_id`, `colH`, `colI`, `colJ`, `colK`) VALUES (1, 'new-value H', 'new-value I', 'new-value J', 'new-value K'), (2, 'new-value H', 'new-value I', 'new-value J', 'new-value K'), -- 省略中间282条记录 (285, 'new-value H', 'new-value I', 'new-value J', 'new-value K') ON DUPLICATE KEY UPDATE colH = VALUES(colH), colI = VALUES(colI), colJ = VALUES(colJ), colK = VALUES(colK);
逻辑说明:插入时如果检测到record_id已存在,就会触发更新操作,而且你只指定了H-K四个列需要更新,完全不会触碰A-G列的原有数据。
注意:MySQL 8.0及以上版本更推荐使用别名写法替代
VALUES()函数:INSERT INTO `table` (`record_id`, `colH`, `colI`, `colJ`, `colK`) VALUES (1, 'new-value H', 'new-value I', 'new-value J', 'new-value K'), -- 省略其他行 (285, 'new-value H', 'new-value I', 'new-value J', 'new-value K') AS new_data ON DUPLICATE KEY UPDATE colH = new_data.colH, colI = new_data.colI, colJ = new_data.colJ, colK = new_data.colK;
操作提示
执行前建议先备份对应表数据,或者先开启事务执行,确认修改结果符合预期后再提交,避免误操作导致数据丢失。
内容的提问来源于stack exchange,提问作者user7862339
相关产品推荐
相关产品推荐

