Mysql更新所有有价值的列'ram'

时间:2012-04-20 12:05:26

标签: mysql sql

我在表中有很多列需​​要根据某些值进行检查,如果找到匹配项则需要替换值。

所以基本上我正在寻找一个查询,它将列名作为变量的一部分并循环遍历表并在匹配时更新列值。

我可以用PHP做到这一点,拥有尽可能多的查询列..但这就是我不想要的......

P.S。我知道这是一个糟糕的设计,在正常情况下,这种要求永远不会发生,但遗憾的是它就是它......

5 个答案:

答案 0 :(得分:6)

在许多声明中:

UPDATE tableX 
SET   col_1 = 'newvalue' 
WHERE col_1 = 'ram';

UPDATE tableX 
SET   col_2 = 'newvalue' 
WHERE col_2 = 'ram';

...

UPDATE tableX 
SET   col_N = 'newvalue' 
WHERE col_N = 'ram';

在一个声明中

UPDATE tableX 
SET   col_1 = CASE WHEN col_1 = 'ram'
                     THEN 'newvalue' 
                     ELSE col_1 
              END
    , col_2 = CASE WHEN col_2 = 'ram'
                     THEN 'newvalue' 
                     ELSE col_2 
              END
    ...

    , col_N = CASE WHEN col_N = 'ram'
                     THEN 'newvalue' 
                     ELSE col_N 
              END
 ;

您可以手动编写语句或使用动态SQL编写语句(如果要使用的列和表太多)。

答案 1 :(得分:2)

这是另一个错误的问题,文字答案对此毫无益处。

如果您需要这样的循环,那么您的数据库设置肯定是错误的。

列必须包含不同的值,而不是在其他列之间共享。

如果您尝试实现某种一对多关系,则必须将这些双列移动到单独表格中的列中。

答案 2 :(得分:1)

UPDATE tablename SET columnname = 'newvalue' WHERE columnname = 'currentvalue';

<强>更新

此PHP脚本将遍历每个列名并将查询应用于它

<?php
$result = mysql_query("SHOW COLUMNS FROM tablename ");
while ($row = mysql_fetch_assoc($result)) {
    mysql_query("UPDATE tablename SET ".$row['field']." = 'newvalue' WHERE ".$row['field']." = 'currentvalue'");
}
?>

答案 3 :(得分:0)

http://dev.mysql.com/doc/refman/5.5/en/show-table-status.html

你可以使用SHOW TABLE STATUS ...命令获取php中的表结构,然后从结果中构建一个更新命令,用更新的匹配数据更新每一列。

可以通过使用SHOW TABLE STATUS LIKE来获取你想要的表...或者SHOW TABLE STATUS WHERE name = ...

答案 4 :(得分:0)

在php中创建它,我会创建表格column=value中的列,值对的数组,一个用于旧值,一个用于新值,然后爆炸此数组,因此查询看起来像

"UPDATE table SET ".explode(',', $newvalues)." WHERE ".explode(' AND ', $oldarray)