说在前面

nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码。

最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中。

说到批量操作,让人最容易想到的是for循环。

错误的 for 循环版本

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

for(let i=0;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查询批量数据插入到另一表内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

mysql插入多行数据来自另一张表_mysql从一张表查询批量数据并插入到另一表中的完整实例...相关推荐

  1. mysql本周函数_MySQL的YEARWEEK函数以及查询本周数据_MySQL

    bitsCN.com MySQL的YEARWEEK函数以及查询本周数据 MySQL 的 YEARWEEK 是获取年份和周数的一个函数,函数形式为 YEARWEEK(date[,mode]) 例如 20 ...

  2. mysql 导出所有表_Mysql导出(多张表)表结构及表数据 mysqldump用法

    命令行下具体用法如下:  mysqldump -u用戶名 -p密码 -d 數據库名 表名 脚本名; 1.导出數據库為dbname的表结构(其中用戶名為root,密码為dbpasswd,生成的脚本名為d ...

  3. mysql百万数据 查总数都特别慢_mysql百万级数据分页查询缓慢优化方法

    参考网址1:https://www.cnblogs.com/nightOfStreet/p/9647926.html           -------------修改需求 一.与产品商讨 修改需求 ...

  4. mysql子查询存到另一张表_MySQL数据库(11)----使用子查询实现多表查询

    子查询指的是用括号括起来,并嵌入另一条语句里的那条 SELECT 语句.下面有一个示例,它实现的是找出与考试类别('T')相对应的所有考试事件行的 ID,然后利用它们来查找那些考试的成绩: SELEC ...

  5. mysql 根据一张表更新另一张表_mysql从一张表更新另一张表,如何效率最高?

    最近工作上遇到的问题,有条sql语句执行时间一直很长,情况如下: a表记录电话通话情况的表,b表记录的是电话通话失败的原因,两表之间通过一个叫sessionid的字段关联在一起.两表结构大致如下: # ...

  6. mysql从一张表更新另外一张表_MySQL 从一张表update字段到另外一张表中

    先来几个简单的示例 Solution 1: 1列 update student s, city c set s.city_name = c.name where s.city_code = c.cod ...

  7. mysql存储过程没有此表_mysql用存储过程写入 一个表A中没有存在在另一个表B的数据...

    需求 Abiao id content 1 sfsdfsg 2 ddsgffd 3 gfggg 4 dggfhfd Bbiao id 2 3 那么我要查询到Abiao 里面在Bbiao没有的数据 (理 ...

  8. php查询mysql表里的数据_PHP/MYSQL 查询大数据/遍历表

    PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50) MYSQL:5.1.51 如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录 ...

  9. mysql查询重复数据,并显示所有重复数据具体信息

    本篇重点:查询重复数据并显示完整信息 首先是一个很常见的查重语句 查询重复数据,并显示完整信息 首先是一个很常见的查重语句 // uid为重复数据的条件,如果直接执行只会出现一条数据,并不能展示完整的 ...

最新文章

  1. mysql join order by_MySQL 14 慢查询优化join、order by、group by
  2. oracle如何自动分析报告,ORACLE 性能分析报告的获取
  3. Meanshift解析
  4. OpenCASCADE绘制测试线束:数据交换命令之XDE 形状命令
  5. python面试刷题app_Python面试的一些心得,与Python练习题分享
  6. Android开发之SDK开发获取资源id报错的问题
  7. XSL学习笔记6 XSLT内置模板规则
  8. arcgis如何打开tif_实例|ArcGiS导出的dxf,在CASS中如何变身?
  9. 喵喵的QQ小程序登录
  10. 微课|中学生可以这样学Python(例7.3):栈
  11. missing privilege separation directory /var/empty/sshd问题解决
  12. JS快速获取本周、本月时间区间的方法
  13. 机器学习OneR算法
  14. 探索性数据分析EDA(二)—— 缺失值处理
  15. 记一次Mysql并发死锁,引出的问题及讨论
  16. 把音频中的某个人声去掉_能不能把一段音频中的人声和背景音乐分开
  17. StringBuilder.AppendFormat(String, Object, Object) 方法
  18. 海量数据实战(0)从两个文件50亿数据中找出相同的URL
  19. linux prompt模式,Linux修改prompt提示的方法 | Soo Smart!
  20. flash中导入音乐和制作按钮

热门文章

  1. 【TypeScript专题】之类型断言
  2. 普遍使用的自动报靶系统有哪些优缺点
  3. VS系列多通道振弦传感器无线采发仪与参数配置工具连接
  4. 孙禄堂论形意桩功三体式
  5. 如何理解“桩家”特斯拉?误区、革命性与疑惑
  6. 绥化学院计算机专业咋样,绥化学院计算机类(含计算机科学与技术、软件工程)专业2016年在河北理科高考录取最低分数线...
  7. Tacotron论文阅读
  8. 云课堂智慧职教计算机作业答案,2020智慧职教云课堂机械设计基础实训答案完整满分课后作业答案...
  9. java_SSM高校教材征订管理系统
  10. Autoruns v9.12