我有一个大约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中的数据包大小不足以进行此查询。
除了增加数据包大小之外,可以做些什么,这似乎是一种糟糕的方法?
答案 0 :(得分:1)
对于类似的任务,我曾使用过以下方法:
session_id GUID
,record_id bigint
列UPDATE
主表使用INNER JOIN
到此表,指定特定的会话ID。DELETE
来自会话ID的所有记录。完成后你可以开始表现:
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