更新多行

时间:2017-03-28 07:21:49

标签: c# mysql sql .net database

我有一个大约500K +记录的DataTable,我想在数据库中为DataTable中包含的每个记录更新一个字段。

目前,我正在获取DataTable的ID列中的所有记录的列表,并在这些ID上创建一个带有SQL in语句的更新语句,如下所示:

string sql = "UPDATE my_table SET my_field = @timestamp WHERE id IN (" + String.Join(", ", myDataTable.AsEnumerable().Select(r => r.Field<Int64>("id")).ToList().ToArray()) + ")";

这适用于一些记录,但由于ID数量很大,我现在收到的错误是MySQL中的数据包大小不足以进行此查询。

除了增加数据包大小之外,可以做些什么,这似乎是一种糟糕的方法?

3 个答案:

答案 0 :(得分:1)

对于类似的任务,我曾使用过以下方法:

  1. 使用session_id GUIDrecord_id bigint
  2. 创建其他表格
  3. 在开始更新操作之前,为此操作生成唯一标识符(session_id)。
  4. 将您必须更新的所有ID与生成的会话ID一起插入此表。
  5. UPDATE主表使用INNER JOIN到此表,指定特定的会话ID。
  6. DELETE来自会话ID的所有记录。
  7. 完成后你可以开始表现:

    • 关闭会话桌的日志记录,因为它不包含任何基本数据;
    • 尝试在每次需要时创建临时表而不是使用静态表(理论上它会简化清理,因为DROP TABLE必须比DELETE FROM快得多,但在我的情况下创建表工作太慢所以我更喜欢使用永久表;)
    • 使用bigint代替GUID - s来识别会话,因为它们必须更快地进行比较;
    • 使用COPY FROM(PostgreSQL)或BULK INSERT(MS SQL)语句而不是INSERT INTO - s系列。虽然我没有找到类似MySQL的东西。

    我不知道什么最适合你)

答案 1 :(得分:0)

我不知道是否可以增加MySQL中的数据包大小,但是通过将UPDATE查询划分为多组ID的多个UPDATE查询,可以解决您的问题

答案 2 :(得分:0)

假设id_list_table包含要在my_table中更新的ID列表:

UPDATE my_table
SET my_field = @timestamp
JOIN id_list_table
ON my_table.id = id_list_table.my_table_id