替换MySQL中的所有字段

时间:2010-06-29 21:57:08

标签: mysql sql replace sql-update

我需要使用REPLACE命令替换表中列中的一些字符。
我知道REPLACE命令需要一个列名,然后是要更改的文本(在下面的例子中,'a'char)和新文本(在下面的例子中,'e'char)。 / p>

UPDATE my_table SET my_column = REPLACE (my_column,'a','e' );

因此,执行此命令会更改my_column表的my_table列中所有' a '的出现次数,并带有' e 'char。

但是如果我需要为每一列执行REPLACE命令而不只是为一个执行呢?这可能吗?

由于

4 个答案:

答案 0 :(得分:11)

使用以下SQL查询生成替换所有列中的值所需的SQL查询。

select concat(
       'UPDATE my_table SET ',
       column_name,
       ' = REPLACE(', column_name, ', ''a'', ''e'');')
from information_schema.columns
where table_name = 'my_table';

执行此SQL查询后,只需运行所有查询即可替换所有值。


在谷歌搜索后未经测试

使用这样的核心创建存储过程。它可以接受表的名称,要查找的值和要替换的值。

主要思想是使用:

  1. 为动态SQL执行准备的语句;
  2. 用于迭代表的所有列的游标。
  3. 请参阅下面的部分代码(未经测试)。

    DECLARE done INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR
        SELECT column_name FROM information_schema.columns
        WHERE table_name = 'my_table';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
    OPEN cur1;
    REPEAT
        SET s = concat(
           'UPDATE my_table SET ',
           column_name,
           ' = REPLACE(', column_name, ', ''a'', ''e'');');
        PREPARE stmt2 FROM s;
        EXECUTE stmt2;
        FETCH cur1 INTO a;
    UNTIL done END REPEAT;
    CLOSE cur1;
    

答案 1 :(得分:6)

我做了一个小改动:

select concat(
   'UPDATE ', table_name, ' SET ',
   column_name,
   ' = REPLACE(', column_name, ', ''OLDTEXT'', ''NEWTEXT'');')
from information_schema.columns
where table_name = 'TABLENAME';

哪个将使用变量进行TABLENAME(只需少一点打字) - 所以你只需要替换大写的东西。

另外,我一开始并不理解,但这只会输出一个SQL查询列表,然后您必须执行这些查询以实际替换代码。希望这会有所帮助...

答案 2 :(得分:2)

这将通过一些PHP来实现,因为MySQL的东西通常包含PHP。 经过测试和工作:)

<?php

        $host = 'localhost';
        $user = 'root';
        $pass = 'yourpass';
        $db = 'your_database_name';

        $connection = mysql_connect($host, $user, $pass);
        mysql_select_db($db);

        $thisword = "this one should be";
        $shouldbe = "like this";
        $thistable = "your_table_name";

        MySQL_replace_all($thisword, $shouldbe, $thistable);

        function MySQL_replace_all($thisword,$shouldbe,$thistable){
            $cnamnes = "SHOW columns FROM " . $thistable;
            $result = mysql_query($cnamnes);
            while($columnname = mysql_fetch_row($result)){
                $replace_SQL = "UPDATE $thistable SET ". $columnname[0] ." = REPLACE(". $columnname[0] .",'". $thisword ."', '". $shouldbe ."');";
                echo $replace_SQL . "<br>";
                mysql_query($replace_SQL);
            }
    }

?>

答案 3 :(得分:-1)

你无法做你想做的事。如果是我,我会列出一个列名列表,并在我的编辑器中进行快速正则表达式搜索和替换。

Find: (.+)

Replace: UPDATE my_table SET \1 = REPLACE (\1,'a','e' );