mysql基于查询结果批量插入和更新

本文介绍了一种使用临时表解决数据整合问题的方法,包括创建临时表、加载数据、更新现有记录和插入缺失记录的过程。

解决办法是用临时表:

One possible way to do this is to create a temporary table, insert the data into that, and then do 1 query with a join to insert the records that don't exist followed by and update to the fields that do exist. The basics would be something like this.

CREATE TABLE MyTable_Temp LIKE MyTable;

LOAD DATA INFILE..... INTO MyTable_Temp;

UPDATE MyTable INNER JOIN 
MyTable_Temp
ON MyTable.ID=MyTable_Temp.ID
SET MyTable.Col1=MyTable_Temp.Col1, MyTable.Col2=MyTable_Temp.Col2.....;

INSERT INTO MyTable(ID,Col1,Col2,...)
SELECT ID,Col1,Col2,... 
FROM MyTable_Temp
LEFT JOIN MyTable 
ON MyTable_Temp.ID = MyTable.ID
WHERE myTable.ID IS NULL;

DROP TABLE MyTable_Temp;

引用自 Kibbee


### MySQL 中基于查询字段实现批量插入MySQL 中,`INSERT INTO ... SELECT ...` 是一种非常高效的批量插入方式。它允许通过查询其他表的数据来动态生成新记录并将其插入目标表中。 #### 语法结构 基本语法如下: ```sql INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段A, 字段B, ... FROM 源表 WHERE 条件; ``` - **目标表** **源表** 可以为同一张表其他不同的表。 - `SELECT` 子句用于定义要插入的目标数据集。 - 如果未指定条件,则默认插入所有符合条件的记录[^4]。 #### 映射关系 当执行 `INSERT INTO ... SELECT ...` 时,字段之间的映射仅取决于目标表 `SELECT` 查询返回的结果集中字段的位置顺序,而与其实际含义无关。例如,在以下语句中: ```sql INSERT INTO table_a (name, code) SELECT code, name FROM table_b; ``` 此操作会将 `table_b` 的 `code` 列值赋给 `table_a` 的 `name` 列,反之亦然[^2]。 #### 示例代码 以下是几个具体的例子展示如何利用该方法完成不同场景下的批量插入需求。 ##### 不带条件的批量插入 假设存在两个表 `source_table` `target_table` ,我们希望将前者的所有记录复制到后者中去: ```sql -- 复制 source_table 中全部数据至 target_table INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table; ``` 如果某些列不存在对应匹配项者不需要填充任何特定值的话,默认会被设置成 NULL 者其自增属性决定初始状态。 ##### 带有条件筛选后的批量插入 继续沿用上面提到的例子,现在只想迁移满足一定约束的部分行而非整个集合: ```sql -- 迁移 source_table 符合 condition_xxx=True 的部分数据至 target_table INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table WHERE condition_xxx = TRUE; ``` 这里增加了 WHERE 子句限定范围,从而实现了更加精确控制哪些条目应该被加入最终结果之中。 ##### 跨数据库/跨服务器环境下的应用扩展 对于更复杂的业务逻辑而言,可能还会涉及到多层嵌套子查询甚至联合外部资源共同构建输入参数列表等情况;此时可以借助临时中间产物作为过渡桥梁简化整体流程设计思路的同时提高可读性维护便利程度。 --- ### 注意事项 尽管这种方法功能强大且灵活多样,但在实际运用过程中仍需注意以下几个方面的问题以免引发潜在风险错误行为发生: 1. 数据类型兼容性验证; 2. 主键冲突处理机制设定(如忽略重复项还是更新已有记录等选项配置); 3. 性能调优考量因素分析(比如索引创建时机安排合理与否直接影响效率表现). 以上这些都需要开发者根据具体项目背景情况做出适当调整优化方案. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值