mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的完整實(shí)例
說(shuō)在前面
nodejs 讀取數(shù)據(jù)庫(kù)是一個(gè)異步操作,所以在數(shù)據(jù)庫(kù)還未讀取到數(shù)據(jù)之前,就會(huì)繼續(xù)往下執(zhí)行代碼。
最近寫東西時(shí),需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量數(shù)據(jù)的查詢后,insert到另一表中。
說(shuō)到批量操作,讓人最容易想到的是for循環(huán)。
錯(cuò)誤的 for 循環(huán)版本
先放出代碼,提前說(shuō)明一下,在這里封裝了sql操作:sql.sever(數(shù)據(jù)庫(kù)連接池,sql語(yǔ)句拼接函數(shù),回調(diào)函數(shù))
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', '后臺(tái)','產(chǎn)品']; //這里是郵件相關(guān)代碼 let group = allGroup[selfgroup - 1]; let mailmsg = "您好," + group + "組通過(guò)人員表已提交,請(qǐng)您盡快審核!"; mail.mailepass(mailmsg); res.write(JSON.stringify({ style:1, msg:"已將名單提交,待管理員審核!" })); res.end(); }) }) }
上面代碼中,是先進(jìn)行數(shù)據(jù)查詢?cè)龠M(jìn)行數(shù)據(jù)的插入,(在這里假定有2條數(shù)據(jù))按照常理,我們想的執(zhí)行順序是:查詢 插入 查詢 插入。然而,并非我們所想那么簡(jiǎn)單,雖然插入操作也確實(shí)在數(shù)據(jù)庫(kù)查詢的回調(diào)中寫的,但是實(shí)際的順序是:查詢 查詢,一旦直接進(jìn)行了兩次查詢,想當(dāng)然后面的代碼直接報(bào)錯(cuò)了。沒(méi)來(lái)得及回調(diào)時(shí),已經(jīng)執(zhí)行了第二次循環(huán)。
改進(jìn)的 for 循環(huán)版本
mysql 用一條語(yǔ)句可以完成查詢并插入,格式為: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', '后臺(tái)', '產(chǎn)品']; let group = allGroup[selfgroup - 1]; let mailmsg = "您好," + group + "組通過(guò)人員表已提交,請(qǐng)您盡快審核!"; mail.mailepass(mailmsg); res.write(JSON.stringify({ style: 1, msg: "已將名單提交,待管理員審核!" })); res.end(); } }) }
這樣,數(shù)據(jù)庫(kù)操作正確,目的達(dá)到了。但是仔細(xì)想來(lái),這樣做還是有缺陷的。如果數(shù)據(jù)量小還好說(shuō),但若數(shù)據(jù)量大時(shí),這樣導(dǎo)致程序和數(shù)據(jù)庫(kù)建立多次連接,會(huì)增加服務(wù)器負(fù)荷。
改進(jìn)版
結(jié)合上一次的缺陷,顧名思義,這次我們要減少程序與數(shù)據(jù)庫(kù)連接次數(shù)。于是,我們不再將插入和查詢寫到一起,而是將其分開(kāi),進(jìn)行批量的插詢,從而利用所查數(shù)據(jù)批量插入。代碼如下:
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語(yǔ)句 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', '后臺(tái)', '產(chǎn)品']; let group = allGroup[selfgroup - 1]; let mailmsg = "您好," + group + "組通過(guò)人員表已提交,請(qǐng)您盡快審核!"; mail.mailepass(mailmsg); res.write(JSON.stringify({ style: 1, msg: "已將名單提交,待管理員審核!" })); res.end(); }) })
補(bǔ)充
批量查詢語(yǔ)法(在這里and與or進(jìn)行了混用) SELECT 列名,列名 FROM 表名 WHERE 條件 AND (item1=‘xxx' OR item1=‘yyy');
一條語(yǔ)句進(jìn)行批量插入語(yǔ)法 INSERT INTO [ 表名 ]([ 列名] ,[ 列名 ]) VALUES([列值],[列值])),([列值],[列值])),([列值],[列值]));
總結(jié)
到此這篇關(guān)于mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的文章就介紹到這了,更多相關(guān)mysql查詢批量數(shù)據(jù)插入到另一表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL左聯(lián)多表查詢where條件寫法示例
- MySQL聯(lián)表查詢的簡(jiǎn)單示例
- mysql嵌套查詢和聯(lián)表查詢優(yōu)化方法
- MySQL 多表查詢實(shí)現(xiàn)分析
- mysql使用from與join兩表查詢的區(qū)別總結(jié)
- MySql實(shí)現(xiàn)跨表查詢的方法詳解
- MySQL數(shù)據(jù)庫(kù)高級(jí)查詢和多表查詢
- mysql中各種常見(jiàn)join連表查詢實(shí)例總結(jié)
- Mysql 如何實(shí)現(xiàn)多張無(wú)關(guān)聯(lián)表查詢數(shù)據(jù)并分頁(yè)
- MySQL?表查詢必備:基本操作詳解
相關(guān)文章
通過(guò)案例分析MySQL中令人頭疼的Aborted告警
這篇文章通過(guò)案例跟大家分析了MySQL中令人頭疼的Aborted告警的相關(guān)資料,文中將Aborted告警介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06MySQL execute、executeUpdate、executeQuery三者的區(qū)別
這篇文章主要介紹了MySQL execute、executeUpdate、executeQuery三者的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-05-05mysql 5.7.5 m15 winx64.zip安裝教程
這篇文章主要為大家詳細(xì)介紹了mysql 5.7.5 m15 winx64.zip安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Navicat連接MySQL時(shí)出現(xiàn)的連接失敗問(wèn)題及解決
這篇文章主要介紹了Navicat連接MySQL時(shí)出現(xiàn)的連接失敗問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05解決mysql創(chuàng)建數(shù)據(jù)庫(kù)后出現(xiàn):Access denied for user ''root''@''%'' to dat
這篇文章主要給大家介紹了如何解決mysql在創(chuàng)建數(shù)據(jù)庫(kù)后出現(xiàn):Access denied for user 'root'@'%' to database 'xxx'的錯(cuò)誤提示,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05MySQL事務(wù)處理與應(yīng)用簡(jiǎn)析
事務(wù)處理在各種管理系統(tǒng)中都有著廣泛的應(yīng)用,比如人員管理系統(tǒng),很多同步數(shù)據(jù)庫(kù)操作大都需要用到事務(wù)處理。這篇文章主要介紹了MySQL事務(wù)處理,需要的朋友可以參考下2014-06-06Mysql存儲(chǔ)引擎InnoDB和Myisam的六大區(qū)別
這篇文章主要介紹了Mysql存儲(chǔ)引擎InnoDB和Myisam的六大區(qū)別,本文從構(gòu)成上、事務(wù)處理、SQL操作、自動(dòng)ID、表行數(shù)等方面講解了它的區(qū)別,需要的朋友可以參考下2015-02-02