【问题标题】:Multiple row update多行更新
【发布时间】:2011-06-12 12:02:26
【问题描述】:

我在使用单个 mysql 语句更新 mysql 表的几行时遇到问题。

我有我想在字符串中更新的 rowid,例如。

$ids="id1, id2, id3, id4,...."

我在另一个字符串中有我的值,例如。

$values="str1, str2, str3, str4,....";

(我有超过 30,000 行要更新)

想法是id1的行应该用str1更新等等。

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 将这 2 个字符串分解为数组并使用 foreach 循环,更新数据库
  • 我有超过 30,000 行要更新......这意味着运行超过 30,000 个查询。有没有更好的解决方案?
  • 您绝对应该进行批量更新。但我不知道怎么做。可能您可以使用 LOAD DATA 和 UPDATE ON DUPLICATE。但这需要研究和测试。
  • 30,000 行如果您将它们分组到事务中应该不会那么糟糕(即不要为每条语句执行一次提交,每 100 次插入执行一次提交等)。假设你在这里使用 InnoDB。

标签: mysql sql sql-update


【解决方案1】:

这将是一个非常丑陋的查询,但是......

update table
set    str = case id
             when id1 then str1
             when id2 then str2
             ...
             end
where  id in (id1, id2, ...)

【讨论】:

  • 将此查询组装为字符串 - 在 for 循环中并运行一次查询。
  • 我想知道 MySQL 将如何处理这么长的查询。 :-D
【解决方案2】:

用两列id和str创建一个临时表,并做一个很长的

INSERT INTO temptable VALUES (id1,str1),(id2,str2)...(idn,strn);

您在 for 循环中构建字符串而不进入数据库。然后你以明显的方式将UPDATE 加入到临时表中。 (索引临时表可能有帮助,也可能没有帮助。)

您不希望有 30K 往返于数据库。 (另一方面,如果遇到最大字符串长度问题,您可能必须拆分 INSERT。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2021-02-15
    • 2012-05-03
    相关资源
    最近更新 更多