我在表中有很多列需要根据某些值进行检查,如果找到匹配项则需要替换值。
所以基本上我正在寻找一个查询,它将列名作为变量的一部分并循环遍历表并在匹配时更新列值。
我可以用PHP做到这一点,拥有尽可能多的查询列..但这就是我不想要的......
P.S。我知道这是一个糟糕的设计,在正常情况下,这种要求永远不会发生,但遗憾的是它就是它......
答案 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)