如何用单条SQL查询批量更新emp表新增ID的EmpID与Date字段?
单条SQL批量处理emp表新增/更新记录的解决方案
问题背景
现有emp表数据如下:
|ID |EmpID |Date | |-----|------|--------------| |6248 |56 |15/5/18 9:10 | |8743 |87 |14/5/18 10:00 | |7656 |78 |15/5/18 13:56 |
现在要给表新增三个ID:5643、5678、8954,要求这些新ID对应的EmpID和Date字段值,和原表中同EmpID的记录完全一致,最终预期结果:
|ID |EmpID |Date | |-----|------|--------------| |5643 |56 |15/5/18 9:10 | |5678 |87 |14/5/18 10:00 | |8954 |78 |15/5/18 13:56 |
需要用单条SQL完成操作,同时要支持2000+条数据的批量处理场景。
分场景解决方案
根据你的实际数据状态,我整理了两种最常见场景的SQL写法:
场景1:新ID还没插入表中(需要批量插入新记录)
可以用INSERT ... SELECT的组合语句,先构造新ID与目标EmpID的映射,再关联原表拉取对应的Date值完成插入:
INSERT INTO emp (ID, EmpID, Date) SELECT new_ids.new_id, e.EmpID, e.Date FROM ( -- 这里列出所有新增ID和对应EmpID的映射,2000+条的话建议用临时表替代 SELECT 5643 AS new_id, 56 AS target_empid UNION ALL SELECT 5678 AS new_id, 87 AS target_empid UNION ALL SELECT 8954 AS new_id, 78 AS target_empid ) AS new_ids JOIN emp e ON e.EmpID = new_ids.target_empid;
如果是2000+条数据,直接写UNION ALL太繁琐,推荐先把新ID和对应EmpID的映射数据导入临时表(比如temp_new_ids),然后修改SQL为:
INSERT INTO emp (ID, EmpID, Date) SELECT t.new_id, e.EmpID, e.Date FROM temp_new_ids t JOIN emp e ON e.EmpID = t.target_empid;
这种方式执行效率很高,适合大规模批量插入。
场景2:新ID已插入表中,但EmpID和Date为空(需要批量更新)
如果新ID的记录已经存在,只是EmpID和Date字段未填充,可以用UPDATE ... JOIN完成批量更新:
UPDATE emp target JOIN ( SELECT 5643 AS target_id, 56 AS target_empid UNION ALL SELECT 5678 AS target_id, 87 AS target_empid UNION ALL SELECT 8954 AS target_id, 78 AS target_empid ) AS new_ids ON target.ID = new_ids.target_id JOIN emp source ON source.EmpID = new_ids.target_empid SET target.EmpID = source.EmpID, target.Date = source.Date;
同样,2000+条数据的话,用临时表替换掉子查询部分即可。
关键注意事项
- 务必确保原表中
EmpID是唯一值,否则JOIN会返回多条记录,导致插入/更新出现重复数据问题。如果EmpID不唯一,需要明确指定取哪一条的Date(比如用MAX(Date)或MIN(Date))。 - 批量操作前一定要在测试环境验证SQL逻辑,避免误操作生产数据。
- 使用临时表的话,操作完成后记得清理临时表。
内容的提问来源于stack exchange,提问作者Sweety
相关产品推荐
相关产品推荐

