我正在尝试使用以下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());
答案 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 |