2010-06-29 3 views
9

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

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

Так что выполнение этой команды изменит все «» вхождение в my_column столбце таблицы my_table с «х» символом.

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

Thanks

+0

dba.stackexchange.com/questions/21147/query-to-find-and-replace-text-in-all-tables-and-fields-of-a-mysql- db – Foreever

ответ

8

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

См. Неполный код (непроверенный) ниже.

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; 
+0

Вы хотите проверить WHERE, чтобы убедиться, что вы пытаетесь запустить замену текста только на столбцах, которые используют текстовые типы данных;). И это можно сделать с помощью MySQL Prepared Statement (динамический SQL) ... –

+0

Не стесняйтесь редактировать мой ответ @OMG Ponies –

+0

Я думаю, но, возможно, я ошибаюсь, что предлагаемому запросу требуется еще одна запятая в позиции (4, 36). Теперь он генерирует UPDATE my_table SET my_column = REPLACE (my_column'ù ',' ù '); вместо UPDATE my_table SET my_column = REPLACE (my_column, 'ù', 'ù'); – Mark

0

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

Find: (.+)

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

5

Я сделал одно небольшое изменение:

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

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

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

1

Это будет делать трюк с некоторым 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

Приобретено по нескольким причинам. Во-первых, хотя есть, возможно, какой-то дико запутанный способ сделать это, вам все равно удалось опубликовать что-то, что * WILL * работает. Во-вторых, вы пришли к тому, чтобы предоставить полный PHP-файл, чтобы сделать это, что полезно для тех, кто только начинает. – John

+0

Спасибо! Хорошая музыка на вашей веб-странице :) Трек 04 .. –

+0

@carl_lingberg Привет, плейлист 2.8? Если так, я сделал эту песню. – John

Смежные вопросы