2012-10-10 63 views
0

當前我有16k行數據在數組中,我使用for循環來循環訪問數據並執行INSERT語句。換句話說,每個循環在mysql中執行一個「INSERT」語句。這完成了16000次。這需要很長時間。在MySQL數據庫中加載16,000行數據的快速方法

有沒有更好的方法來插入批量數據?

+1

沒有任何代碼我只能猜測。您可以嘗試將所有值存儲在數組中,然後只做一個插入。 – noel

+0

什麼是你的表類型,你是否在每次插入語句之後使用自動提交? –

回答

0

可以由Pascal MARTIN嘗試這種按post

Dim Command As New SqlCommand(_ 
      "insert into hilmarc_cem_items " & _ 
      "(CEMID, " & _ 
      "ItemCode, " & _ 
      "UnitPrice, " & _ 
      "Quantity, " & _ 
      "UOM) "  


    Dim ItemCodes() As String = Request.Form.GetValues("ItemCode") 
    Dim UnitPrices() As String = Request.Form.GetValues("UnitPrice") 
    Dim Quantities() As String = Request.Form.GetValues("Quantity") 
    Dim UOMs() As String = Request.Form.GetValues("UOM") 

    For Counter = 0 To ItemCodes.Length - 1 
     Command.CommandText &= "select @CEMID, @ItemCode" & Counter & ", @UnitPrice" & Counter & ", @Quantity" & Counter & ", @UOM" & Counter & " " 
     Command.Parameters.Add("@ItemCode" & Counter, Data.SqlDbType.NVarChar).Value = ItemCodes(Counter) 
     Command.Parameters.Add("@Quantity" & Counter, Data.SqlDbType.Decimal).Value = Quantities(Counter) 
     Command.Parameters.Add("@UOM" & Counter, Data.SqlDbType.NVarChar).Value = UOMs(Counter) 
     Command.Parameters.Add("@UnitPrice" & Counter, Data.SqlDbType.Decimal).Value = UnitPrices(Counter) 
     If Not Counter = ItemCodes.Length - 1 Then 
      Command.CommandText &= "union all " 
     Else 
      Command.CommandText &= ";" 
     End If 
    Next 

的想法是有一個單一的查詢:

insert into your_table (field1, field2, field3) 
values 
    (value1_1, value1_2, value1_3), 
    (value2_1, value2_2, value2_3), 
    (value3_1, value3_2, value3_3) 
0

我使用此代碼(與sqlParameters)完成了這個在SQL ,從數組獲取所有數據並將它們作爲參數添加到sqlCommand中。查詢會是這樣的:

insert into myTable 
     (CEMID, 
     ItemCode, 
     UnitPrice, 
     Quantity, 
     UOM) 
    select @CEMID, @ItemCode0, @UnitPrice0, @Quantity0, @UOM0 
    union all 
    select @CEMID, @ItemCode1, @UnitPrice1, @Quantity1, @UOM1 
    union all 
    select @CEMID, @ItemCode1, @UnitPrice1, @Quantity1, @UOM1 
    union all 

我不確定這是否在MySQL中有效,只需將代碼轉換爲MySQL。

0

嘗試生成bulk-INSERTs語句。該語句的長度應小於max_allowed_packet,這是一個數據包或任何生成/中間字符串的最大大小。

如果可能 - 暫時禁用或刪除表中的索引。