如何在MySQL中批量插入记录?

时间:2016-07-02 16:39:41

标签: c# mysql

我必须在同一个表中复制超过100k的记录,并且在第一个表中的每一行插入之后,第二个表将使用第一个表插入ID(主键)进行更新。 我试图进行批量插入,但后来我不会得到所有插入的ID将插入第二个表。 我正在使用MySQL 5.5。当我运行以下代码时,我得到以下随机错误:

  1. 查询期间与MySQL服务器的连接丢失。
  2. 与当前连接关联的事务已完成 但尚未处理。交易必须先处理 该连接可用于执行SQL语句。
  3. 网络数据包乱序:收到[x],预期[y]。
  4. 如何以最佳方式插入这些记录?

      

    CODE;

    foreach (var item in transactions)
    {
        int transactionId;
        using (MySqlCommand cm = DM.ConnectionManager.Conn.CreateCommand())
        {
            cm.CommandType = System.Data.CommandType.Text;
            var commandText = @"INSERT INTO FirstTable SET 
                            column1=@column1;";
            cm.CommandText = commandText;
            cm.Parameters.AddWithValue("@column1", item.column1);
    
            cm.ExecuteNonQuery();
    
            transactionId = (int)cm.InsertId;
        }
    
        foreach (var item in item.TransactionDetails)
        {
            using (MySqlCommand cm = DM.ConnectionManager.Conn.CreateCommand())
            {
                cm.CommandType = System.Data.CommandType.Text;
                var commandText = @"INSERT INTO SecondTable SET 
                            column1=@column1,
                            column2=@column2;";
                cm.CommandText = commandText;
                cm.Parameters.AddWithValue("@column1", item.column1);
                cm.Parameters.AddWithValue("@column2", item.column2);
    
                cm.ExecuteNonQuery();
    
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

导入MySQL的最快方法是INFILE,因此我建议制作一个CSV文件,然后将以下内容作为SQL语句运行。 请注意我没有完整的C#设置并对此进行了测试......但是当我希望它快速完成时,它是我备份/恢复MySQL的方式...所以我假设当设置为“commandText时可以运行以下内容“并在创建CSV文件并将其写入磁盘后运行。

LOAD DATA LOCAL INFILE 'import.csv' INTO TABLE MyTable FIELDS TERMINATED BY ','
  ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
    (Col1,Col2,Col3);

From https://dev.mysql.com/doc/refman/5.7/en/load-data.html“LOAD DATA INFILE语句以非常高的速度将文本文件中的行读取到表格中......”