-3

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

所以基本上我正在寻找一个查询,它将列名作为变量排序并遍历表并更新列值(如果匹配)..

我可以用 php 做到这一点,查询与列一样多..但这就是我不想要的..

ps 我知道这是一个糟糕的设计,在正常情况下不会出现这样的要求,但遗憾的是它就是这样......

4

5 回答 5

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 编写语句(如果要工作的列和表太多)。

于 2012-04-20T12:16:02.860 回答
2

这是另一个错误的问题,字面的回答是没有用的。

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

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

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

于 2012-04-20T12:30:45.890 回答
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'");
}
?>
于 2012-04-20T12:08:09.760 回答
0

在 php 中创建它,我将创建列数组,值对 form column=value,一个用于旧值,一个用于新值,然后分解这个数组,这样查询看起来像

"UPDATE table SET ".explode(',', $newvalues)." WHERE ".explode(' AND ', $oldarray)
于 2012-04-20T12:23:26.327 回答
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 = ... 来获取您想要的表

于 2012-04-20T12:16:10.443 回答