替换 MySQL 中的所有字段

Posted

技术标签:

【中文标题】替换 MySQL 中的所有字段【英文标题】:Replace all fields in MySQL 【发布时间】:2011-03-09 20:58:15 【问题描述】:

我需要使用REPLACE 命令替换表格列中的一些字符。 我知道REPLACE 命令需要一个列名,然后是要更改的文本(在以下示例中为“a”字符)和新文本(在以下示例中为“e”字符)。

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

因此,执行此命令将使用 'e' 字符更改 my_table 表的 my_column 列中出现的所有 'a'。

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

谢谢

【问题讨论】:

dba.stackexchange.com/questions/21147/query-to-find-and-replace-text-in-all-tables-and-fields-of-a-mysql-db 【参考方案1】:

使用以下 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 查询后,只需运行所有查询以替换所有值。


谷歌搜索后未经测试

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

主要思想是使用:

    为动态 SQL 执行准备的语句; 用于遍历表的所有列的游标。

请参阅下面的部分代码(未经测试)。

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;

【讨论】:

您需要检查 WHERE 以确保您尝试仅在使用基于文本的数据类型的列上运行文本替换;)。这可以使用 MySQL Prepared Statements(动态 SQL)来完成...... 我认为,但也许我错了,建议的查询在位置 (4, 36) 处需要多一个逗号。现在它生成 UPDATE my_table SET my_column = REPLACE(my_column'ù', 'ù');而不是 UPDATE my_table SET my_column = REPLACE(my_column,'ù', 'ù');【参考方案2】:

我做了一个小改动:

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

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

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

【讨论】:

【参考方案3】:

这可以解决一些 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);
            
    

?>

【讨论】:

赞成有几个原因。首先,虽然可能有一些非常复杂的方法可以做到这一点,但您仍然设法发布了 WILL 有效的内容。其次,您努力提供完整的 PHP 文件来执行此操作,这对刚开始的人很有帮助。 @carl_lingberg 不客气,播放列表 2.8?如果是这样,我就做了那首歌。 当然,这是播放列表 2.8【参考方案4】:

你不能做你想做的事。如果是我,我会列出列名,然后在我的编辑器中进行快速的正则表达式搜索和替换。

Find: (.+)

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

【讨论】:

以上是关于替换 MySQL 中的所有字段的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库某个字段的所有值匹配替换

批量替换 MySQL 指定字段中的字符串

mySQL怎么批量替换查询结果中的字段值?

MYSQL数据库里面的字段怎么随机替换字符

MySQL搜索并替换字段中的一些文本

MYSQL中怎么替换某个字段值的空白值替换为特定值