2013-01-09 38 views
5

मेरे पास एक मूडल इंस्टॉलेशन है जिसे मैं दूसरे सर्वर पर माइग्रेट कर चुका हूं और मुझे पुराने डोमेन में कई संदर्भों को बदलने की जरूरत है।सभी पंक्तियों के सभी क्षेत्रों में सभी तालिकाओं के लिए मैं एक MySQL डेटाबेस में स्ट्रिंग को कैसे प्रतिस्थापित कर सकता हूं?

किसी दिए गए डेटाबेस के लिए MySQL में किसी अन्य स्ट्रिंग के लिए स्ट्रिंग को मैं सभी टेबल, सभी फ़ील्ड और सभी पंक्तियों को कैसे खोज सकता हूं?

मुझे फ़ील्ड नामों को बदलने की आवश्यकता नहीं है, केवल मान।


संबंधित: How can I use mySQL replace() to replace strings in multiple records?

लेकिन चिह्नित के रूप में जवाब समाधान का अर्थ है मैं दृढ़ता से तालिका नाम लिखें और मैं मैन्युअल रूप से स्क्रिप्ट N बार चल प्रत्येक मेज पर काम नहीं एक पूरे डेटाबेस में इस पर सक्रिय होने चाहिए,।

+0

फिर आप एक नई टेबल बनाते हैं ... उस पुराने को छोड़ दें .. जैसा कि आप सभी पंक्तियों में सभी क्षेत्रों में सभी तालिकाओं को कह रहे हैं ... यह सचमुच एक संपूर्ण डेटाबेस है? – bonCodigo

+0

मैं एक प्रश्न लिखने की कोशिश करता हूं जो स्क्रिप्ट उत्पन्न करता है जो इसे तालिका के लिए एक प्रश्न करेगा ... – ppeterka

+0

@ppeterka: मेटा, मुझे यह पसंद है। लेकिन मुझे उम्मीद है कि MySQL में कुछ बनाया गया है। इन दिनों कौन जानता है, पोस्टग्रेज़ में सरणी फ़ील्ड हैं और ऐसे! – sergserg

उत्तर

2

मैं INFORMATION_SCHEMA.COLUMNS से पूछताछ और गतिशील रूप से कॉलम और तालिकाओं को खोजने पर विचार करता हूं। DB में सभी स्तंभों और तालिकाओं का एक कर्सर बनाने की तरह कुछ का प्रयास करें:

DECLARE col_names CURSOR FOR 
SELECT column_name, table_name 
FROM INFORMATION_SCHEMA.COLUMNS 

फिर तालिकाओं में से प्रत्येक में स्तंभों में से प्रत्येक के माध्यम से पुनरावृति और अद्यतन करने के लिए जहां स्ट्रिंग मौजूद गतिशील/तैयार एसक्यूएल चलाते हैं।

यहाँ अच्छी पदों की एक जोड़ी सही दिशा में प्राप्त करने के लिए कर रहे हैं:

https://stackoverflow.com/a/4951354/1073631

https://stackoverflow.com/a/5728155/1073631

7

यह थोड़ा सा लग सकता है ... बदसूरत। लेकिन शायद डेटाबेस को एक एसक्यूएल/टीटीटी फ़ाइल में डंप करें, सभी स्ट्रिंग्स को प्रतिस्थापित करें और संशोधित डंप का उपयोग करके डेटाबेस को फिर से बनाएं।

+0

मेरे पास अंतिम उपाय है, एक mysqldump और आयात करने में डेटाबेस में लगभग 170GB बड़ा होने में कई घंटे लगेंगे। – sergserg

+0

क्या आपको पता है कि लिनक्स पर मुझे कमांड को टर्मिनल से सीधे .sql फ़ाइल में टेक्स्ट बदलने के लिए क्या देखना चाहिए? – sergserg

+0

आपको क्या लगता है कि अंतर्निहित कार्यों का उपयोग करके ऐसा करना तेजी से होगा? पूर्ण पाठ खोज वह है जो उपकरण का उपयोग किया जाता है। मैं टेक्स्ट फ़ाइल पर लिनक्स sed का उपयोग कर daresay किसी भी अंतर्निहित उपकरण से तेज होगा। // संपादित करें: मैंने लिखा है - 'sed' जो आप – Dariusz

2

आप सभी udpate बयान आप को चलाने के लिए की आवश्यकता होगी बनाने के लिए निम्नलिखित कोड चला सकते हैं अपने अपडेट करने के लिए। यह आपके डेटाबेस के भीतर प्रत्येक तालिका में प्रत्येक फ़ील्ड को अपडेट करेगा। आपको यह कोड चलाने की आवश्यकता होगी, और परिणामों की प्रतिलिपि बनाना होगा और उन्हें चलाएं।

चेतावनी - परीक्षण परीक्षण में इसका परीक्षण करना सुनिश्चित करें। आप किसी अप्रिय आश्चर्य नहीं चाहते हैं। आवश्यकतानुसार संशोधित करें।

SELECT concat('UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, ' = REPLACE(', COLUMN_NAME, ', ''STRING_TO_REPLACE'', ''REPLACE_STRING'')') 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE TABLE_SCHEMA = 'YOUR_DATABASE_NAME' 
     AND DATA_TYPE IN ('char', 'varchar') 
; 

मैंने इसे केवल चार और वर्कर फ़ील्ड तक सीमित कर दिया। आपको अतिरिक्त डेटा प्रकार जोड़ने की आवश्यकता हो सकती है।

+0

बस अपडेट किया गया, मैं एक समापन कोष्ठक खो रहा था। – Tom