Поиск и замена текста во всей таблице с помощью запроса MySQL
обычно я использую ручной поиск для замены текста в базе данных MySQL с помощью phpmyadmin. Я устал от этого сейчас, как я могу запустить запрос, чтобы найти и заменить текст новым текстом во всей таблице в phpmyadmin?
пример: найти ключевое слово domain.com
заменить на www.domain.com
.
8 ответов
на single table
обновление
UPDATE `table_name`
SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')
С multiple tables
-
если вы хотите редактировать из всех таблиц, лучший способ-взять dump
а то find/replace
и загрузить его обратно.
самый простой способ, который я нашел, - это сбросить базу данных в текстовый файл, запустить команду 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
легко peasy.
поместите это в файл 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']);
}
запуск 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')
UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);
например, если я хочу заменить все вхождения John на Mark, я буду использовать ниже,
UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
другой вариант-создавать высказывания для каждого столбца в базе:
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_%';
Это должно создать список инструкций update, которые затем можно выполнить.
Я считаю, что" swapnesh " ответ, чтобы быть лучшим ! К сожалению, я не смог выполнить его в phpMyAdmin (4.5.0.2), который, хотя и нелогичный (и попробовал несколько вещей), продолжал говорить, что найден новый оператор и что разделитель не найден...
таким образом, я пришел со следующим решением, которое может быть полезно, если вы exeprience ту же проблему и не имеют никакого другого доступа к базе данных, чем 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`;
генерировать запросы SQL изменения (быстро)
mysql-e " выберите CONCAT ('update ', table_name, ' set ', column_name, ' = replace (', column_name,', "www.oldsite.com", "www.newsite.com");') как выписка из information_schema.столбцы, где table_name как ' wp_%' " - u root-p your_db_name_here > upgrade_script.в SQL
удалить любой мусор в начале файла. У меня было немного.
nano upgrade_script.в SQL
запустить созданный скрипт с --опция, чтобы пропустить ошибки. (Медленно-возьмите кофе, если большой DB)
mysql-u root-p your_db_name_here --force