我有一個臨時表(從舊系統轉儲,有一長串很多細節)與約8K記錄,我需要分解它,使用一些邏輯和插入數據分成3個不同的表格。Mysql多表插入約8k記錄
table_temp (id, name, address, email, phone, mobile, etc......)
tbluser (id, username, password, roleid, status)
tblstudent (id, userid, name, address, classid, sectionid, etc.....)
tblstudentdetails(id, studentid, address, contact details....)
因爲我需要獲取數據,請放入一些邏輯併爲所有這些表創建單獨的插入語句。我試圖創建大型插入語句,如:
INSERT INTO `tbluser`(`instsessassocid`, `username`, `password`, `roleid`, `status`) VALUES
('1','[email protected]','$2y10$gFscDWwWKR8Iven6R','3','1'),
('1','SONAM[email protected]','$2y10$gFscDWwWKR8Iven6R','3','1'),
('1','[email protected]','$2y10$gFscDWwWKR8Iven6R','3','1')
而對於其他表一樣(你的想法):
INSERT INTO `tblstudent`(`scholarnumber`,`firstname`, `middlename`,`lastname`) VALUES
('10000','PRAGUN','','TANWAR'),('10001','SONAM','','-'),
('10002','HITESH','','KUMAR'),('10003','KHUSHI','','MEHTA'),
('10004','ADITYA','','VASYANI')
創建4條大插入語句後,我將它們存儲在一個數組併發送到我的插入功能,它推遲了自動提交,採取每個插入語句,一旦一切正常,提交併應返回插入ID等
我的應用程序似乎超時(目前設置爲默認/ 30秒),當然這樣一個小插入不應該超時,任何人都可以點弄清楚我做錯了什麼,或者我可以怎樣改進。
這是我的插入功能:
function dbInsert($sql) {
if (is_array($sql) == 0) {
$sqlarray[] = $sql;
} else {
$sqlarray = $sql;
}
$sqlCount = count($sqlarray); //echoThis($sqlCount); die;
$con = dbConnect();
$insertID = array();
try {
// begin a transaction
$con->autocommit(FALSE);
/* commit transaction */
foreach ($sqlarray as $value) {
if ($con->query($value)) {
$insertID[] = $con->insert_id;
} else {
trigger_error(mysqli_error($con));
}
}
// if no error, commit.
if ((!mysqli_error($con)) || (!mysqli_commit($con)) && ($sqlCount === count($insertID))) {
$con->commit(); //mysqli_commit($con);
} else {
$con->rollback();
trigger_error("Error in dbInsert: " . mysqli_error_list($con));
$con->close();
}
} catch (Exception $e) {
// if any error, catch the exception and rollback
$con->rollback();
trigger_error("Error in dbInsert:" . $e);
}
/* close connection and return the result */
$con->close();
return $insertID;
}
這只是一個測試,一旦整理我將需要進口相當多的記錄,所以我希望能有「現成的腳本」,它需要我可以使用。
我知道加載infile或mysqlimport的方式,但我需要的邏輯,我真的認爲我的腳本應該能夠完成這項工作。請注意,我在我的本地主機上,沒有其他配置機器發生任何事情。
謝謝!
您是使用MyIsam表還是Innodb? Innodb支持交易,但進口速度很慢。如果要計算執行時間,可以嘗試導入少量行,並在操作前後獲取時間戳。一旦完成,計算腳本要花多長時間是個小問題。 – Osuwariboy
@Osuwariboy,我正在使用innodb。是的,我可以將它分解成更小的腳本。但是,如果大約3k記錄(這是一組插入成爲什麼)應該超時?我正在做的事情或者事情的方式有什麼嚴重的錯誤嗎?感謝堆! – Anx