使用CASE更新多行需要永远

时间:2013-12-28 10:02:20

标签: php mysql

我正在尝试使用以下PHP代码更新表的多行。 main_key是主键,显然已编入索引。我试过多次运行代码,每次我这样做只是在那里坐了很久。 (我不是游戏让它运行超过10秒,以防它以某种方式破坏文件。)

我想更新很多行,但我只是先测试几行。

该表有大约1.5M的记录。

$query = "UPDATE myfile SET service_no = 
(CASE main_key
     WHEN 72016 THEN 484
     WHEN 985643 THEN 1874
END)";
mysql_query($query) or die(mysql_error());

当我将代码更改为正常的单记录更新时,它会立即运行:

$query = "UPDATE myfile SET service_no = 484
          WHERE main_key = 72016";
mysql_query($query) or die(mysql_error());

1 个答案:

答案 0 :(得分:0)

目前还不清楚你想要得到什么 这两个问题完全不同 要更新所有行吗?或者只有main_key为72016或985643的行?


第一个查询更新整个表(所有行) 假设我们有下表:

|  MAIN_KEY | SERVICE_NO |
|-----------|------------|
|         1 |          1 |
|     72016 |          1 |
|    985643 |          1 |
| 111111111 |          1 |

第一个查询将service_no列的某些值与main_key = 72016 or 985643的行组合在一起,并为所有其他行分配NULL。我很慢,因为它正在改变整个表格(所有行):

|  MAIN_KEY | SERVICE_NO |
|-----------|------------|
|         1 |     (null) |
|     72016 |        484 |
|    985643 |       1874 |
| 111111111 |     (null) |

第二个查询只更改mail_key = 72016的行,而不会触及其他行 - 它会跳过它们,因此速度更快:

|  MAIN_KEY | SERVICE_NO |
|-----------|------------|
|         1 |          1 |
|     72016 |        484 |
|    985643 |          1 |
| 111111111 |          1 |

看一下这个演示:http://www.sqlfiddle.com/#!2/0e1c2/1

如果您只想更改main_key = 72016 or 985643的行,并且不想更改其他行,请使用此查询:

  UPDATE myfile SET service_no = 
     CASE main_key
        WHEN 72016 THEN 484
        WHEN 985643 THEN 1874
     END
  WHERE main_key IN ( 72016, 985643 );

如果在main_key上创建了索引,则此查询会更快,因为它会跳过除72016,985643之外的其他行。 请参阅此演示中的第三个查询:http://www.sqlfiddle.com/#!2/0e1c2/1
运行此查询后的表格如下所示:

|  MAIN_KEY | SERVICE_NO |
|-----------|------------|
|         1 |          1 |
|     72016 |        484 |
|    985643 |       1874 |
| 111111111 |          1 |