Заменить все поля в MySQL - PullRequest
10 голосов
/ 30 июня 2010

Мне нужно заменить некоторые символы в столбцах таблицы с помощью команды REPLACE.Я знаю, что команде REPLACE требуется имя столбца, затем текст для изменения (в следующем примере символ 'a') и новый текст (в следующем случае символ 'e').

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

Таким образом, выполнение этой команды изменит все вхождения ' a ' в столбце my_column таблицы my_table на символ ' e '.

Но что, если мне нужно выполнить команду REPLACE для каждого столбца, а не только для одного?Возможно ли это?

Спасибо

Ответы [ 4 ]

11 голосов
/ 30 июня 2010

Используйте следующий запрос 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 просто выполните все запросы, чтобы заменить все значения.

Не проверено после некоторого поиска в Google

Создайте хранимую процедуру с таким ядром, как это.Он может принимать имя таблицы, значение, которое нужно найти, и значение, которое нужно заменить.

Основная идея заключается в использовании:

  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;
6 голосов
/ 07 декабря 2011

Я внес одно незначительное изменение:

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

, которое будет использовать переменную для TABLENAME (чуть меньше ввода) - так что вам нужно только заменить содержимое заглавными буквами.

Кроме того, я сначала не понял, но это будет только вывод списка SQL-запросов, которые вы затем должны выполнить, чтобы фактически заменить код.Надеюсь, это поможет ...

2 голосов
/ 01 марта 2013

Это подойдет для некоторых 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);
            }
    }

?>
0 голосов
/ 30 июня 2010

Ты не можешь делать то, что хочешь. Если бы это был я, я бы взял список имен столбцов и в моем редакторе сделал бы быстрый поиск и замену регулярного выражения.

Find: (.+)

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

...