我有一个包含80个字段的MySQL表,我想更新包含指定值的所有字段。例如,我想将item1
的字段更新为值0
:
id_num field1 field2 field3 field4 field5
1 item1 item2 item3 item4 item5
2 item3 item3 item3 item4 item5
3 item2 item1 item3 item4 item5
4 item5 item4 item3 item2 item1
5 item1 item1 item3 item4 item5
6 item2 item2 item4 item4 item5
结果应为:
id_num field1 field2 field3 field4 field5
1 0 item2 item3 item4 item5
2 item3 item3 item3 item4 item5
3 item2 0 item3 item4 item5
4 item5 item4 item3 item2 0
5 0 0 item3 item4 item5
6 item2 item2 item4 item4 item5
我想用MySQL查询来做。我遇到的问题是,有80个字段,我将不得不使用80个查询,如:
update set field1=0 where field1=item1;
update set field2=0 where field2=item1;
等等,这会让人筋疲力尽! :(
答案 0 :(得分:3)
在UPDATE
语句中,WHERE
子句确定更新了哪些行。在这里,您还需要确定要更新的列;因此WHERE
子句的唯一用途是识别和过滤掉根本不需要改变任何列的行,即:
UPDATE table
SET
...
WHERE field1 = "item1"
OR field2 = "item1"
OR field3 = "item1"
...;
但是根据列数和你想要做的事情判断,你无法获得这样一个查询的覆盖索引。并且由于它们都是OR
条件,因此您甚至不可能使用一个非常有选择性的索引来阻止全表扫描。这意味着WHERE
子句对你来说可能完全没用,而你的UPDATE
在任何合理大的桌子上都会变慢。
因此您无法过滤行,您只能选择SET
的哪些列;但是在任何给定的行中,您可能必须设置任何列。因此,使用SQL,您实际上必须SET
每个列;但应用条件,以便您只需更改值。使用CASE
表达式:
UPDATE table
SET
field1 = CASE field1 WHEN "item1" THEN "0" ELSE field1 END,
field2 = CASE field2 WHEN "item1" THEN "0" ELSE field2 END,
field3 = CASE field3 WHEN "item1" THEN "0" ELSE field3 END,
...;
我在这里使用"item1"
和"0"
只是为了保持一致性,因为你没有告诉我们这些列的数据类型是什么。显然,请使用您自己的值。
虽然看到了你的问题,但是必须要问的问题是:为什么每列都有相同的“item1”?您应该在每列中包含不同类型的数据,而不是一遍又一遍地重复相同类型的数据。您正在描述的表格似乎存在严重的设计问题;你应该认真研究重新设计。您无法使用查询过滤掉任何行的事实是一个很大的警告信号。
答案 1 :(得分:2)
在许多陈述中,你可以这样做。
UPDATE table
SET field1 = '0'
WHERE field1 = 'item1';
UPDATE table
SET field2 = '0'
WHERE field2 = 'item1';
...
UPDATE table
SET fieldN = '0'
WHERE fieldN = 'item1';
在一个声明中,您可以这样做。
UPDATE table
SET field1 = CASE WHEN field1 = 'item1'
THEN '0'
ELSE field1
END
, field2 = CASE WHEN field2 = 'item1'
THEN '0'
ELSE field2
END
...
, fieldN = CASE WHEN fieldN = 'item1'
THEN '0'
ELSE fieldN
END
;
但是,我认为这是另一个错误的问题,没有字面的答案会有效。
我需要这样的循环,你的数据库设计可能是错误的。
列必须包含不同的值,而不是其他列中的共享值。
更新 :(一个php解决方案) 这个PHP脚本将遍历每个列名并将查询应用于它。
<?php
$result = mysql_query("SHOW COLUMNS FROM table ");
while ($row = mysql_fetch_assoc($result)) {
mysql_query("UPDATE table SET ".$row['field']." = '0' WHERE ".$row['field']." = 'item1'");
}
?>
答案 2 :(得分:1)
如果您可以访问带有php的Web服务器,则可以执行以下操作:
<?php
$connection = new mysqli( host, user, password, database );
// Skipping error checking
for ($i = 0; i < num_of_columns; i++) {
$connection->query( "UPDATE table SET field".i."=0 WHERE field".i."='item1'" );
}
?>
您还应该考虑数据库规范化,这样可以管理数据的行为。