更新表中包含特定值的所有字段

时间:2015-02-06 23:00:07

标签: mysql sql

我有一个包含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;
等等,这会让人筋疲力尽! :(

3 个答案:

答案 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'" );
}
?>

您还应该考虑数据库规范化,这样可以管理数据的行为。