使用MySQL查询在整个表中查找和replace文本
通常我使用手动查找来使用phpmyadminreplaceMySQL数据库中的文本。 我现在厌倦了,我怎么能运行一个查询来查找和replace文本在phpmyadmin整个表中的新文本?
例如:查找关键字domain.com
,replace为www.domain.com
。
对于single table
更新
UPDATE `table_name` SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')
从multiple tables
–
如果你想从所有表格编辑,最好的办法是采取dump
,然后find/replace
并上传回来。
把它放在一个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']); }
我find的最简单的方法是将数据库转储到文本文件,运行sed命令进行replace,然后将数据库重新加载到MySQL中。
所有的命令都是从Linux内存打开的。
将数据库转储到文本文件
mysqldump -u user -p databasename > ./db.sql
运行sed命令查找/replace目标string
sed -i 's/oldString/newString/g' ./db.sql
重新加载数据库到MySQL
mysql -u user -p databasename < ./db.sql
十分简单。
在PHPmyadmin中运行SQL查询来查找并replace所有WordPress博客文章中的文本,例如查找mysite.com/wordpress,并用mysite.com/newsreplace该文本。此示例中的表格为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的所有事件,我会在下面使用,
UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
另一种select是为数据库中的每个列生成语句:
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_%';
这应该生成一个可以执行的更新语句列表。
我相信“swapnesh”答案是最好的! 不幸的是,我不能在phpMyAdmin(4.5.0.2)中执行它,虽然不合逻辑(尝试了几件事情),但它一直说一个新的语句被发现,并且没有发现分隔符。
因此,我提出了以下解决scheme,如果您遇到同样的问题,并且没有其他访问数据库的权限,那么可能是有用的。
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`;
要testing您可能想要使用的预期结果:
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查询(FAST)
mysql -e“SELECT CONCAT('update',table_name,'set',column_name,'= replace(',column_name,',''www.oldsite.com'',''www.newsite.com''); ')AS语句FROM information_schema.columns WHERE table_name LIKE'wp_%'“-u root -p your_db_name_here> upgrade_script.sql
在文件开始处删除任何垃圾。 我有一些。
nano upgrade_script.sql
使用–force选项运行生成的脚本来跳过错误。 (慢 – 如果大DB抢咖啡)
mysql -u root -p your_db_name_here –force <upgrade_script.sql