2012-08-07 14 views
169

का उपयोग कर पूरी तालिका में पाठ को ढूंढें और बदलें, आमतौर पर मैं phpmyadmin का उपयोग करके एक MySQL डेटाबेस में टेक्स्ट को प्रतिस्थापित करने के लिए मैन्युअल खोज का उपयोग करता हूं। मैं अब इसके बारे में थक गया हूं, मैं phpmyadmin में पूरी तालिका में नए पाठ के साथ टेक्स्ट खोजने और बदलने के लिए क्वेरी कैसे चला सकता हूं?एक MySQL क्वेरी

उदाहरण: कीवर्ड domain.com खोजें, www.domain.com के साथ प्रतिस्थापित करें।

+0

संभव http://stackoverflow.com/questions/639531/mysql-search- की डुप्लीकेट इन-ऑल-फ़ील्ड-से-प्रत्येक-टेबल-से-डेटाबेस-डेटाबेस – sel

+1

आप कुछ ऐसा कर सकते हैं जैसे [यह] [1]। [1]: http://stackoverflow.com/questions/562457/search-for-all-occurrences-of-a-string-in-a-mysql-database/10182498#10182498 – Pramod

+0

[यह ] (https://github.com/interconnectit/Search-Replace-DB) आपको जो चाहिए उसे प्राप्त करने में आपकी सहायता करेगा। – Dom

उत्तर

415

एक single table अद्यतन

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

multiple tables से के लिए -

आप सभी तालिकाओं से संपादित करना चाहते हैं, तो सबसे अच्छा तरीका है dump और फिर find/replace लेने के लिए और इसे वापस अपलोड करने के लिए है।

+3

क्या यह पूरे क्षेत्र को प्रतिस्थापित करता है, या इसके साथ किसी फ़ील्ड के भीतर एक सबस्ट्रिंग मैच करता है? –

+1

यह @RandyGreencorn क्षेत्र के भीतर एक सबस्ट्रिंग को प्रतिस्थापित करेगा। यह केस-संवेदी भी है। – Andrew

+3

और यह 'www.domain.com' और 'www.domain.com' के साथ 'डोमेन.com' को 'www.www.domain.com' के साथ बदल देगा – michelek

18

खोजने के लिए और इस तरह के mysite.com/wordpress खोजने और जगह है कि mysite.com/news साथ इस उदाहरण में टेबल tj_posts

UPDATE `tj_posts` 
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news') 
है के रूप में सभी वर्डप्रेस ब्लॉग पोस्ट, में पाठ बदलने के लिए phpMyAdmin में एक SQL क्वेरी चल रहा है
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 में पुनः लोड करें।

सभी आदेश स्मृति से लिनक्स पर बैश हैं। पाठ फ़ाइल में

डंप डेटाबेस

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

यह आश्चर्यजनक तेज़ काम करता है। मुझे इस समाधान से प्यार है। मुझे कुछ यूआरएल प्रतिस्थापन करना था और स्लैश का उपयोग करने के बजाय मेरे डिलीमीटर के रूप में मैंने पाइप का उपयोग किया था (इसे पढ़ें http://www.grymoire.com/Unix/Sed.html)। उदाहरण: sed -i's http: //olddomain.com | http: //newdomain.com | g './db.sql –

+1

यह इतना तेज़ था कि मैंने सोचा कि यह काम नहीं करता है। लेकिन ऐसा हुआ! इसके अलावा, आप इस तरह के स्लेश से बच सकते हैं: '\/\/domain.com' –

+1

बस एक अनुस्मारक कि ओएस एक्स में, 'sed -i' कमांड' unterminated विकल्प पैटर्न 'त्रुटि को फेंक सकता है। आप इसके बजाए 'sed -i' '-e' s/oldString/newString/g '।/Db.sql' का उपयोग कर सकते हैं। – afterglowlee

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

+2

यह आपके पास बहुत अच्छा तरीका है, यदि आपके पास बहुत अधिक डेटा है और इसे डंप/पुनः लोड नहीं किया जा सकता है। – Kariem

+0

ओह आदमी यह बहुत अच्छा काम किया! मैं इस विचार के आधार पर अपनी स्क्रिप्ट साझा करूंगा – Andy

2

मुझे विश्वास है कि "स्वपनेश" का जवाब सबसे अच्छा है! दुर्भाग्य से मैं इसे phpMyAdmin (4.5.0 में निष्पादित नहीं कर सका।2) जो हालांकि अजीब (और कई चीजों की कोशिश की) यह कहता रहा कि एक नया बयान पाया गया था और कोई भी डिलीमीटर नहीं मिला ...

इस प्रकार मैं निम्नलिखित समाधान के साथ आया जो उपयोगी हो सकता है यदि आप एक ही मुद्दे को अपनाना चाहते हैं और पीएमए से डेटाबेस के लिए कोई अन्य पहुँच ...

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

परिवर्तन एसक्यूएल प्रश्नों (फास्ट)

उत्पन्न

mysql -e "चयन CONCAT ('अपडेट', table_name, 'set', column_name, '= replace (', column_name, ',' 'www.oldsite.com', '' www.newsite.com '' '); ') Info_schema.columns से AS कथन जहां table_name LIKE' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

फ़ाइल की शुरुआत में किसी भी कचरे को हटाएं। मेरे पास थोड़े थे। --force विकल्प त्रुटियों को छोड़ के साथ

नैनो upgrade_script.sql

भागो उत्पन्न स्क्रिप्ट। (धीमी - अगर बड़ा डीबी एक कॉफी हड़पने)

mysql -u जड़ -p your_db_name_here --force < upgrade_script.sql

संबंधित मुद्दे