mysql从一张表查询批量数据并插入到另一表中的完整实例

说在前面

nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码。
最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中。
说到批量操作,让人最容易想到的是for循环。

错误的 for 循环版本

先放出代码,提前说明一下,在这里封装了sql操作:sql.sever(数据库连接池,sql语句拼接函数,回调函数)

for(let i=0;i<views.xuehao.length;i++){
	sql.sever(pool,sql.select(["name"],"registryinformation",["xuehao="+sql.escape(views.xuehao[i])]),function(data){
  sql.sever(pool,sql.insert("personnelqueue",["xuehao","name","selfgroup","time"],[sql.escape(views.xuehao[i]),data[0].name,selfgroup,'NOW()'],true),function(){
  let allGroup = ['Android', 'ios', 'Web', '后台','产品'];	//这里是邮件相关代码
  let group = allGroup[selfgroup - 1];
  let mailmsg = "您好," + group + "组通过人员表已提交,请您尽快审核!";
  mail.mailepass(mailmsg);
  res.write(JSON.stringify({
   style:1,
   msg:"已将名单提交,待管理员审核!"
  }));
  res.end();
  })
 })
}

上面代码中,是先进行数据查询再进行数据的插入,(在这里假定有2条数据)按照常理,我们想的执行顺序是:查询 插入 查询 插入。然而,并非我们所想那么简单,虽然插入操作也确实在数据库查询的回调中写的,但是实际的顺序是:查询 查询,一旦直接进行了两次查询,想当然后面的代码直接报错了。没来得及回调时,已经执行了第二次循环。

改进的 for 循环版本

mysql 用一条语句可以完成查询并插入,格式为:INSERT IGNORE INTO 插入表表名 (item1,item2) SELECT item1,item2 FROM 查询表表名 WHERE,于是乎,便想到了下面的解决方案。

for (let i = 0; i < views.xuehao.length; i++) {
 sql.sever(pool, 'INSERT IGNORE INTO personnelqueue (xuehao,name,selfgroup,time) SELECT xuehao,name,selfgroup,NOW() FROM registryinformation WHERE xuehao=' + sql.escape(views.xuehao[i]) + ' and pass=' + state, function () {
  if (i == views.xuehao.length - 1) {
   let allGroup = ['Android', 'ios', 'Web', '后台', '产品'];
   let group = allGroup[selfgroup - 1];
   let mailmsg = "您好," + group + "组通过人员表已提交,请您尽快审核!";
   mail.mailepass(mailmsg);
   res.write(JSON.stringify({
    style: 1,
    msg: "已将名单提交,待管理员审核!"
   }));
   res.end();
  }
 })
}

这样,数据库操作正确,目的达到了。但是仔细想来,这样做还是有缺陷的。如果数据量小还好说,但若数据量大时,这样导致程序和数据库建立多次连接,会增加服务器负荷。

改进版

结合上一次的缺陷,顾名思义,这次我们要减少程序与数据库连接次数。于是,我们不再将插入和查询写到一起,而是将其分开,进行批量的插询,从而利用所查数据批量插入。代码如下:

let sqlString = 'SELECT xuehao,name,selfgroup FROM registryinformation WHERE pass=' + state + ' AND (xuehao=' + sql.escape(views.xuehao[0]);
for (let i = 1; i < views.xuehao.length; i++) {
 sqlString += ' OR xuehao=' + sql.escape(views.xuehao[i]);
}
sqlString = sqlString + ')';
sql.sever(pool, sqlString, function (data) {
 //拼接插入sql语句
 let istSqlStr = 'INSERT IGNORE INTO personnelqueue (xuehao,name,selfgroup,time) VALUES (' + data[0].xuehao + ',' + sql.escape(data[0].name) + ',' + data[0].selfgroup + ',NOW())';
 for (let j = 1; j < data.length; j++) {
 istSqlStr += ',(' + data[j].xuehao + ',' + sql.escape(data[j].name) + ',' + data[j].selfgroup + ',' + 'NOW())';
 }
 sql.sever(pool, istSqlStr, function () {
 let allGroup = ['Android', 'ios', 'Web', '后台', '产品'];
 let group = allGroup[selfgroup - 1];
 let mailmsg = "您好," + group + "组通过人员表已提交,请您尽快审核!";
 mail.mailepass(mailmsg);
 res.write(JSON.stringify({
  style: 1,
  msg: "已将名单提交,待管理员审核!"
 }));
 res.end();
 })
})

补充

批量查询语法(在这里and与or进行了混用) SELECT 列名,列名 FROM 表名 WHERE 条件 AND (item1=‘xxx' OR item1=‘yyy');
一条语句进行批量插入语法 INSERT INTO [ 表名 ]([ 列名] ,[ 列名 ]) VALUES([列值],[列值])),([列值],[列值])),([列值],[列值]));

总结

到此这篇关于mysql从一张表查询批量数据并插入到另一表中的文章就介绍到这了,更多相关mysql查询批量数据插入到另一表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL查询结果复制到新表的方法(更新、插入)

    MySQL中可以将查询结果复制到另外的一张表中,复制的话通常有两种情况,一种是更新已有的数据,另一种是插入一条新记录.下面通过例子来说明.首先构建两个测试表. 表t1: 表t2: 1.如果t2表中存在score值,将score更新到t1表中.方法如下: UPDATE t1,t2 SET t1.score = t2.score WHERE t1.id = t2.id AND t2.score IS NOT NULL 这就是将查询结果作为条件更新另一张表,当然,t2也可以是更为复杂的一个查询结果而不

  • mysql从一张表查询批量数据并插入到另一表中的完整实例

    说在前面 nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码. 最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中. 说到批量操作,让人最容易想到的是for循环. 错误的 for 循环版本 先放出代码,提前说明一下,在这里封装了sql操作:sql.sever(数据库连接池,sql语句拼接函数,回调函数) for(let i=0;i<views.xuehao.length;i++){ sql.sever(pool,sql.select(

  • Thinkphp连表查询及数据导出方法示例

    本文实例讲述了Thinkphp连表查询及数据导出的方法.分享给大家供大家参考,具体如下: 这今天实验室的招新工作就要展开了,我们通过实验室网站关联到杭电OJ,大一的新生将他们杭电的用户名在实验室网站提交,网站就会通过网络爬虫到杭电OJ上面进行数据抓取存到实验室数据库. 现在我要做的事就是把新生表和新生OJ数据表联合导出.实验室网站是用thinkphp框架开发的.所以根据以前的工作经验.问题很快就解决了. 现在跟大家分享一下. thinkphp的扩张类都是放在ORG目录下面,在通过import()

  • MySQL存储过程的创建使用以及实现数据快速插入

    目录 一,存储过程介绍 二,存储过程的优缺点 三,存储过程的创建与调用 3.1,存储过程中的常用语法及参数 3.2,存储过程的使用 四,存储过程中的变量及使用细则 4.1,变量定义 4.2,变量赋值 4.3,用户变量的使用 4.4,存储过程的一些常用查看命令 五,常用的存储过程的控制语句 5.1,条件语句 5.1.1,if-then-else 5.1.2,case语句 5.2,循环语句 5.2.1,while ……end while语句 5.2.2,repeat……end repeat语句 5.

  • MySQL联表查询的简单示例

    MySql会用到联表查询,对于刚学习的新手来说,可能会理解起来有难度.下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 关系型数据库,免不了表之间存在各种引用与关联.这些关联是通过主键与外键搭配来形成的.所以,取数据时,很大情况下单张表无法满足需求,额外的数据则需要将其他表加入到查询中来,这便是 JOIN 关键字完成的操作. MySQL 中 JOIN, CROSS JOIN 和 INNER JOIN 三者语法功能上相同,可

  • 详解MySQL数据库--多表查询--内连接,外连接,子查询,相关子查询

    多表查询 使用单个select 语句从多个表格中取出相关的查询结果,多表连接通常是建立在有相互关系的父子表上; 1交叉连接 第一个表格的所有行 乘以 第二个表格中的所有行,也就是笛卡尔积 创建一个消费者与顾客的表格: 代码如下: -- create table customers( -- id int primary key auto_increment, -- name VARCHAR(20)not null, -- address VARCHAR(20)not NULL -- ); -- C

  • MySQL数据库设计概念及多表查询和事物操作

    目录 数据库设计概念 数据库设计简介 表关系(多对多) 表关系(一对多) 表关系之一对一 多表查询 笛卡尔积现象 内连接查询 嵌套查询(子查询) 事务操作 事务的概念 手动提交事务 自动提交事务 事务原理和四大特征 事务原理 事务的四大特征 事务的并发访问引发的三个问题(面试) 事务的隔离级别 数据库设计概念 数据库设计简介 1.数据库设计概念 数据库设计就是根据业务系统具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型. 建立数据库中的表结构以及表与表之间的关联关系的过

  • MySQL数据库查询之多表查询总结

    目录 多表关系 表与表之间的联系: 一对多(多对一) 多对多 一对一 多表查询 多表查询的分类 1.连接查询: 2.子查询 内连接 外连接 自连接 联合查询 子查询 标量子查询 列子查询 行子查询 表子查询 多表查询案例 总结 多表关系 在进行数据库表结构的设计时,会根据业务的需求和业务模块之间的关系,分析设计表结构,由于业务之间相互关联,所以各个表结构之间也存在各种联系 表与表之间的联系: 1.一对多(多对一) 2.多对多 3.一对一 一对多(多对一) 例如,一个员工对应一个部门,一个部门可以

  • MySQL多表查询的案例详解

    多表查询 案列说明 笛卡尔积的理解 select id,department_name from employees,departments;#错的 select id,department_id,department_name from employees CROSS JOIN departments;#错的 每个员工和每个部门匹配了一遍(查出的条目数=id数*department数) 错误原因:缺少连接条件 笛卡尔积的解决 编写连接条件: 表1.列 = 表二.列(若多个表连接,至少要用n-1

  • Mybatis多表查询与动态SQL特性详解

    目录 1.较复杂的查询操作 1.1 参数占位符 #{} 和 ${} 1.2SQL注入 1.3like查询 1.4resultType与resultMap 1.4多表查询 1.4.1一对一表映射 1.4.2一对多表映射 2.动态SQL 2.1if标签 2.2trim标签 2.3where标签 2.4set标签 2.5foreach标签 总结 1.较复杂的查询操作 1.1 参数占位符 #{} 和 ${} #{}:预处理符,如将id=#{2}替换为id=?,然后使用2替换?. ${}:替换符,如将id

  • MyBatis学习教程(五)-实现关联表查询方法详解

    一.一对一关联  1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR() ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VAR

随机推荐