it-swarm.com.ru

Найти и заменить текст во всей таблице, используя запрос MySQL

Обычно я использую ручной поиск, чтобы заменить текст в базе данных MySQL с помощью phpmyadmin. Я устал от этого сейчас, как я могу выполнить запрос, чтобы найти и заменить текст новым текстом во всей таблице в phpmyadmin? 

Пример: найти ключевое слово domain.com, заменить на www.domain.com.

207
alyasabrina

Для обновления single table 

 UPDATE `table_name`
 SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')

От multiple tables

Если вы хотите редактировать из всех таблиц, лучше всего взять dump, а затем find/replace и загрузить его обратно.

492
swapnesh

Самый простой способ, который я нашел, - выгрузить базу данных в текстовый файл, выполнить команду sed для замены и перезагрузить базу данных обратно в MySQL.

Все команды bash на Linux из памяти.

Дамп базы данных в текстовый файл

mysqldump -u user -p databasename > ./db.sql

Запустите команду sed, чтобы найти/заменить целевую строку

sed -i 's/oldString/newString/g' ./db.sql

Перезагрузите базу данных в MySQL

mysql -u user -p databasename < ./db.sql

Очень просто.

30
siliconrockstar

Поместите это в файл php и запустите его, и он должен делать то, что вы хотите.

// Connect to your MySQL database.
$hostname = "localhost";
$username = "db_username";
$password = "db_password";
$database = "db_name";

mysql_connect($hostname, $username, $password);

// The find and replace strings.
$find = "find_this_text";
$replace = "replace_with_this_text";

$loop = mysql_query("
    SELECT
        concat('UPDATE ',table_schema,'.',table_name, ' SET ',column_name, '=replace(',column_name,', ''{$find}'', ''{$replace}'');') AS s
    FROM
        information_schema.columns
    WHERE
        table_schema = '{$database}'")
or die ('Cant loop through dbfields: ' . mysql_error());

while ($query = mysql_fetch_assoc($loop))
{
        mysql_query($query['s']);
}
26
Lee Woodman

Выполнение SQL-запроса в PHPmyadmin для поиска и замены текста во всех сообщениях блога WordPress, например, поиск mysite.com/wordpress и замена его на mysite.com/newsТаблица в этом примере - tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
21
guest
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Как, например, если я хочу заменить все вхождения Джона Марком, я буду использовать ниже, 

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
8
Umesh Patil

Другой вариант - создать операторы для каждого столбца в базе данных:

SELECT CONCAT(
    'update ', table_name , 
    ' set ', column_name, ' = replace(', column_name,', ''www.oldDomain.com'', ''www.newDomain.com'');'
) AS statement
FROM information_schema.columns
WHERE table_schema = 'mySchema' AND table_name LIKE 'yourPrefix_%';

Это должно создать список операторов обновления, которые вы затем сможете выполнить.

6
Farid.O

Я считаю, что "swapnesh" ответ будет лучшим! К сожалению, я не смог выполнить его в phpMyAdmin (4.5.0.2), который, хотя и нелогичен (и перепробовал несколько вещей), постоянно повторял, что было найдено новое утверждение и что разделитель не найден…

Таким образом, я пришел к следующему решению, которое могло бы быть полезным, если вы испытываете ту же проблему и не имеете другого доступа к базе данных, кроме PMA…

UPDATE `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid` 
 FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
SET `toUpdate`.`guid`=`updated`.`guid`
WHERE `toUpdate`.`ID`=`updated`.`ID`;

Чтобы проверить ожидаемый результат, вы можете использовать:

SELECT `toUpdate`.`guid` AS `old guid`,`updated`.`guid` AS `new guid`
FROM `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid`
 FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
WHERE `toUpdate`.`ID`=`updated`.`ID`;
2
llange

лучше всего, если вы экспортируете его как файл sql и открываете его с помощью редактора, такого как код Visual Studio, и находите и перераспределяете ваши слова .... Я заменяю файл в 1 гигабайт sql за 1 минуту на 16 Word, всего 14600 Word . это лучший способ . и после замены сохраните и импортируйте его снова . Не забудьте сжать его с помощью Zip для импорта.

0
Omid Ahmadyani

Генерация запросов на изменение SQL (FAST)

mysql -e "SELECT CONCAT ('update', table_name, 'set', column_name, '= replace (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') Как оператор FROM information_schema.columns WHERE table_name LIKE' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

Удалите весь мусор в начале файла. У меня было немного.

nano upgrade_script.sql

Запустите сгенерированный скрипт с опциями --force, чтобы пропустить ошибки. (МЕДЛЕННО - возьмите кофе, если большая БД)

mysql -u root -p your_db_name_here --force <upgrade_script.sql

0
Andy