2015-07-01 91 views
0

我有一個臨時表(從舊系統轉儲,有一長串很多細節)與約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的方式,但我需要的邏輯,我真的認爲我的腳本應該能夠完成這項工作。請注意,我在我的本地主機上,沒有其他配置機器發生任何事情。

謝謝!

+0

您是使用MyIsam表還是Innodb? Innodb支持交易,但進口速度很慢。如果要計算執行時間,可以嘗試導入少量行,並在操作前後獲取時間戳。一旦完成,計算腳本要花多長時間是個小問題。 – Osuwariboy

+0

@Osuwariboy,我正在使用innodb。是的,我可以將它分解成更小的腳本。但是,如果大約3k記錄(這是一組插入成爲什麼)應該超時?我正在做的事情或者事情的方式有什麼嚴重的錯誤嗎?感謝堆! – Anx

回答

0

你在做什麼似乎沒有任何內在的錯誤。但是,從你告訴我的情況來看,數據已經在一個表格中排成一行。所以也許你可以讓MySQL爲你做邏輯而不是PHP。這就是我的意思是:

1),因爲你需要你的第一個臨時表,所以你有足夠的接收信息,你想

2添加儘可能多的領域),下面是一個會讓你拆分解決方案與給定的分隔符的字符串:

Split value from one field to two

你在這裏做什麼是這樣

UPDATE myTable 
SET newField1 = SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 1), ' ', -1), 
newField2 = SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 1), ' ', -1), 
.... 

到底查詢,你想要的是你的數據分成所有的各個領域,而不是一個大領域。

4)最後,你可以這樣做:

INSERT INTO tbluser 
SELECT field1, field2, field3 FROM myTable 

一旦數據在其適當的表,你可以運行一系列更新的那會修復任何邏輯是必要的,使數據適合生產。我不知道這是否會比批量插入更快,但我認爲這是值得一試的。

+0

謝謝。實際上,我需要拆分數據,從不同的表中獲取新的ID(通過select語句),並相應地插入3表中。我注意到我可以插入大約456條記錄,然後超時。我曾嘗試將數據寫入csv文件並執行mysqlimport。但是如果能夠通過php + mysql來完成這個任務,我將需要導入相當多的數據。我很驚訝,它無法處理這個,但我不知道如何改善這一點。有趣的是,MS訪問似乎做得快得多。儘管謝謝你的幫助! – Anx

+1

你知道,如果表格都是臨時的,你可以將它們創建爲MyIsam,然後做一個改變表格將它們轉換爲Innodb。而且,Innodb在表格有索引字段時會顯着減慢速度。也許你可以嘗試創建你的表並在數據加載完成後放置索引。 – Osuwariboy

+0

謝謝@Osuwariboy,我會盡力的。然而,現在,我每次限制了大約500個記錄集;它看起來更長,但我能夠根據需要導入所有數據。再次感謝! – Anx