替换MySQL中的所有字段

Mar*_*ark 10 mysql sql replace sql-update

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

UPDATE my_table SET my_column = REPLACE (my_column,'a','e' );
Run Code Online (Sandbox Code Playgroud)

这样执行这个命令将改变所有的" 中"出现my_column的列my_table表与" è "字符.

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

谢谢

Jor*_*ira 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';
Run Code Online (Sandbox Code Playgroud)

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


谷歌搜索后未经测试

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

主要想法是使用:

  1. 为动态SQL执行准备的语句;
  2. 游标迭代表的所有列.

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

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;
Run Code Online (Sandbox Code Playgroud)


小智 6

我做了一个小改动:

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

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

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