2012-08-07 17 views
169

通常我使用手動查找來使用phpmyadmin替換MySQL數據庫中的文本。我現在厭倦了它,我怎麼能運行一個查詢來查找並替換phpmyadmin中整個表中的新文本的文本?使用MySQL查詢在整個表中查找和替換文本

示例:查找關鍵字domain.com,用www.domain.com替換。

+0

可能http://stackoverflow.com/questions/639531/mysql-search-的重複從數據庫中的每個表中都可以做到這一點 – sel 2012-08-07 04:05:28

+1

你可以做一些像[this] [1]這樣的事情。 [1]:http://stackoverflow.com/questions/562457/search-for-all-occurrences-of-a-string-in-a-mysql-database/10182498#10182498 – Pramod 2013-04-16 06:50:41

+0

[本](https://github.com/interconnectit/Search-Replace-DB)將幫助你實現你所需要的。 – Dom 2014-08-25 20:07:03

回答

415

對於single table更新

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

multiple tables -

如果你想從所有表編輯,最好的辦法是採取dump然後find/replace,並將它上傳。

+3

這是否替換整個字段,或與它做一個字段內的子字符串匹配? – 2013-11-14 21:09:19

+1

它將替換字段@RandyGreencorn中的子字符串。它也是區分大小寫的。 – Andrew 2016-08-15 20:34:13

+3

,它將用'www.domain.com'和'www.domain.com'替換'domain.com'用'www.www.domain.com' – michelek 2016-12-16 00:59:51

18

運行在phpMyAdmin SQL查詢來尋找,並在所有的WordPress博客文章,如發現mysite.com/wordpress和更換與mysite.com/news 表在這個例子中是tj_posts

UPDATE `tj_posts` 
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news') 
替換文本
23

把它放在一個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']); 
} 
8
UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required); 

像例如,如果我想馬克替換約翰所有出現下面我會使用,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark'); 
22

我發現最簡單的方法是將數據庫轉儲到文本文件,運行sed命令執行替換操作,然後將數據庫重新加載到MySQL中。

所有的命令都是在內存中的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。

+1

這個工作非常快。我喜歡這個解決方案。我不得不做一些URL替換,而不是使用斜槓作爲我的分隔符,而是使用了管道(請閱讀http://www.grymoire.com/Unix/Sed.html)。例如:sed -i's | http://olddomain.com | http://newdomain.com | g'./db.sql – 2015-02-09 04:49:21

+1

它太快了,我認爲它沒有工作。但它確實! 此外,你可以像這樣轉義斜槓:'\/\/domain.com' – 2016-08-25 08:52:08

+1

只需提醒一下,在OS X中,'sed -i'命令可能會拋出'未終止的替代模式'錯誤。您可以使用'sed -i''-e's/oldString/newString/g'。/ db.sql'。 – afterglowlee 2017-01-31 22:05:00

5

另一種選擇是生成報表的數據庫中的每個列:

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_%'; 

這應該生成更新語句,你就可以執行的列表。

+2

比傾銷速度慢,但對於不熟悉命令行的人來說,此答案具有創造性和有效性。 – Stephane 2016-08-14 13:36:37

+2

這是迄今爲止最好的方法,如果您有大量數據並且無法轉儲/重新加載它。 – Kariem 2017-03-20 08:57:40

+0

哦,這人很好!我會基於這個想法分享我的腳本 – Andy 2017-11-03 17:40:52

2

我相信「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`; 
0

產生變化的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選項運行生成的腳本以跳過錯誤。 (SLOW - 如果搶大DB咖啡)

的mysql -u根-p your_db_name_here --force < upgrade_script.sql