【问题标题】:Update 20,000 rows with same value using MySQL使用 MySQL 更新 20,000 行具有相同值的行
【发布时间】:2016-07-15 07:58:00
【问题描述】:

在一个超过 500,000 行的 MySQL 表中,如何更新 20,000 行的同一列的相同值?

我有一个默认为 0 的已处理列,我想将其更新为 3,以便不会选择这 20,000 个条目进行处理。

到目前为止我所做的尝试:我创建了一个包含所有 20,000 个 ID 列表的文件并尝试了以下查询:

update table set processed=3 where id in (...)

然后我尝试将 id 列表粘贴到 ... 中,但它使系统挂起。

编辑:

在表格中,我希望保留其他行processed=0,因此set processed=3 where processed=0 将不起作用。我必须按 ID 定位特定行。

【问题讨论】:

  • 所以您想将0 的每个实例替换为3
  • 更新表集已处理=3 其中已处理=0;
  • 我不确定您的说明是否非常清楚。你会扩展吗? target specific row by ID 是什么意思?
  • @halfer:这意味着要更新的行无法从它们的当前值中识别,只能从它们各自的唯一 ID 中识别(假设这些不是值)......这意味着唯一的选择是可以在UPDATE 语句(或等效语句)中列出 20,000 个 ID。
  • @halfer:乍一看,WHERE id IN (...) 很容易被误读为WHERE id IN SELECT(...),我给你:)

标签: mysql command-line


【解决方案1】:

这就是我所做的:

我创建了一个 PHP 脚本,它使用 id 从文件中获取 id,然后使用 for 循环创建一个查询并专门更新该行:

ID 文件:

5351245
5351246
5351247
...
5373362
5373363
5373364

PHP 脚本:

$file = "ids.txt";
$link = mysqli_connect("localhost", "[USERNAME]", "[PASSWORD]", "[DATABASE]");

$handle = fopen($file, "r");
if ($handle) {
    while (($id = fgets($handle)) !== false) {
        $sql = "UPDATE responses SET bucketID=0, processed=3 WHERE messageID=".$id.";";
        if(mysqli_query($link, $sql)){
            echo "Record $id was updated successfully.\n";
        } else {
            echo "ERROR: Could not able to execute $sql. " . mysqli_error($link)."\n";
        }
    }
    fclose($handle);
}

【讨论】:

  • 您正在运行 20,000 UPDATEs。 PHP 脚本是一个合理的想法,但我至少会构建并发送 UPDATE 语句,例如 1000 行。
  • @LightnessRacesinOrbit 你会怎么做?
  • 试一试,让我看看结果——我会给出一些反馈。
  • @LightnessRacesinOrbit 不错。给我一点时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多