Insert on Select遇重复时,如何批量更新目标表所有列?
解决MySQL批量插入并更新所有列的问题
针对你提到的将t2所有记录插入t1,冲突时更新所有列(共60余列)的需求,有以下几种可行方案:
方案1:使用REPLACE INTO(最简单但有副作用)
如果业务上可以接受删除冲突记录再插入的行为,直接用REPLACE INTO语句即可,无需手动列所有字段:
REPLACE INTO t1 SELECT * FROM t2;
注意事项:
- 该语句依赖t1的主键或唯一索引来识别冲突记录
- 会删除原冲突记录再插入新记录,若表有外键关联可能触发级联删除;自增主键会被重新生成,和UPDATE的行为不同,请确认业务是否允许
方案2:动态生成ON DUPLICATE KEY UPDATE语句
如果需要保留原记录的主键(或不允许删除操作),可以通过MySQL系统表自动生成包含所有列的更新语句,避免手动编写60余列:
执行以下SQL生成完整的插入更新语句:
SELECT CONCAT( 'INSERT INTO t1 SELECT * FROM t2 ON DUPLICATE KEY UPDATE ', GROUP_CONCAT(CONCAT('t1.', column_name, ' = VALUES(', column_name, ')') SEPARATOR ', ') ) AS full_update_query FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = 't1' AND column_name NOT IN ('你的主键列名'); -- 排除主键列,因为主键冲突才触发更新,无需修改
执行后会得到一个完整的INSERT...ON DUPLICATE KEY UPDATE语句,直接复制该语句执行即可完成批量插入+全列更新。
关键前提说明
- 必须保证t1和t2的列顺序、数量、数据类型完全一致,否则
INSERT INTO t1 SELECT * FROM t2会报错 - t1必须存在主键或唯一索引,否则
ON DUPLICATE KEY UPDATE和REPLACE INTO都无法识别冲突记录,会直接插入重复数据
内容的提问来源于stack exchange,提问作者SAI SANTOSH CHIRAG
相关产品推荐
相关产品推荐

