MySQL 存储过程批量插入

本文关键字:插入 存储过程 MySQL | 更新日期: 2023-09-27 18:30:36

我有一个看起来像这样的存储过程:

InsertItem: INSERT INTO (IN itemId INT, name TEXT);

有没有办法执行其中的大部分?就像而不是执行这样的事情:

using (MySqlConnection connection = new MySqlConnection(_connectionString))
{
    connection.Open();
    foreach (Item item in GetItems())
    {
        using (MySqlCommand command = new MySqlCommand("InsertItem", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@itemId", item.ItemId);
            command.Parameters.AddWithValue("@name", item.Name);
            command.ExecuteNonQuery();
        }
    }
}

我正在尝试实现看起来像那样的代码,但没有成功:

using (MySqlConnection connection = new MySqlConnection(_connectionString))
{
    connection.Open();
    using (MySqlCommandBulk command = new MySqlCommand("InsertItem", connection))
    {
        command.CommandType = CommandType.StoredProcedure;
        for (Item item in GetItems())
        {
            MySqlCommandBulkItem bulkItem = new MySqlCommandBulkItem();
            bulkItem["itemId"] = item.ItemId;
            bulkItem["name"] = item.Name;
            command.BulkItems.Add(bulkItem);
        }
        command.Execute();
    }
}

我的观点是,该命令将一次发送所有数据,并且不会单独发送每个查询。
有什么想法吗?

MySQL 存储过程批量插入

Dotnet 框架的 Oracle 连接器允许使用数组代替参数上的标量。但是MySQL连接器没有。

有两种方法可以在 MySQL 中加速批量加载。

其中一个适用于InnoDB表,但对MyISAM表没有帮助。开始交易。然后,在每几百行之后,提交它并开始另一个。这将成堆提交您的表插入,这比单独自动提交它们更快。

另一种是使用 MySQL 的 LOAD DATA INFILE 命令来获取数据文件并将其批量插入数据库。这非常快,但您必须努力正确格式化文件。