2009-06-16 10 views
6

क्या MySQL में regexp के साथ हर ईमेल पते को अपडेट करने का कोई तरीका है? मैं कुछ@domain.xx पते को [email protected] में बदलना चाहता हूं। क्या एसक्यूएल के साथ ऐसा करना संभव है या उदाहरण के लिए मैं PHP के साथ ऐसा करूँ?MySQL (regexp?) में ईमेल पते अपडेट कर रहे हैं

धन्यवाद!

उत्तर

18

आप के साथ MySQL के साथ खोज सकते हैं, लेकिन दुर्भाग्यवश, यह मिलान किए गए हिस्से को वापस नहीं कर सकता है।

यह इस प्रकार के रूप में SQL साथ यह करने के लिए संभव है:

UPDATE mytable 
SET  email = REPLACE(email, '@domain.xx', '@domain.yy') 
WHERE email REGEXP '@domain.xx$' 

आप WHERE खंड को छोड़ सकते हैं, लेकिन यह अप्रत्याशित परिणाम का कारण बन सकता है (जैसे @example.xxx.com@example.yyx.com साथ प्रतिस्थापित किया जाएगा), तो यह बेहतर है छोड़ने के लिए यह।

0

यह जाँच नहीं किया, के बाद से mysql स्थापित नहीं है, लेकिन यह आप

update table_name 
set table_name.email = substr(table_name.email, 0, position("@" in table_name.email) + 1) 
         + "new_domain"; 

पुनश्च मदद कर सकता है लगता है। Regexp आपको अद्यतन के लिए मदद नहीं करेगा, क्योंकि यह स्ट्रिंग ओटी जांच में स्ट्रिंग के विशिष्ट प्रवेश का पता लगाने में आपकी सहायता कर सकता है जब भी स्ट्रिंग पैटर्न से मेल खाती है। Here आप प्रासंगिक कार्यों के संदर्भ पा सकते हैं।

2

यदि संभव हो तो मैं PHP के साथ ऐसा करूंगा। दुर्भाग्य से MySQL दुर्भाग्यवश नियमित अभिव्यक्तियों में मिलान करने वाले हिस्सों को कैप्चर करने की अनुमति नहीं देता है। या और भी बेहतर: आप दो इस तरह, उदाहरण के लिए गठजोड़ कर सकते हैं:

$emails = fetchAllDistinctEmailsIntoAnArray(); 
# Make the array int-indexed: 
$emails = array_values($emails); 
# convert the mails 
$replacedEmails = preg_replace('/xx$/', 'yy', $emails); 
# create a new query 
$cases = array(); 
foreach ($emails as $key => $email) { 
    # Don't forget to use mysql_escape_string or similar! 
    $cases[] = "WHEN '" . escapeValue($email) . 
       "' THEN '" . escappeValue(replacedEmails[$key]) . "'"; 
} 
issueQuery(
    "UPDATE `YourTable` 
    SET `emailColumn` = 
     CASE `emailColumn`" . 
      implode(',', $cases) . 
     " END CASE"); 

ध्यान दें कि यह समाधान बहुत कुछ समय लगेगा और आप स्मृति से बाहर चला सकते हैं या मारा निष्पादन सीमा अगर आप अपने डेटाबेस में कई प्रविष्टियाँ । आप इस स्क्रिप्ट के लिए स्मृति सीमा को बदलने के लिए ignore_user_abort() और ini_set() पर देखना चाहेंगे।

अस्वीकरण: स्क्रिप्ट का परीक्षण नहीं किया गया! कोड को समझने/परीक्षण किए बिना उपयोग न करें (आपके डीबी को गड़बड़ कर सकता है)।

3
UPDATE tableName 
SET email = CONCAT(SUBSTRING(email, 1, locate('@',email)), 'domain.yy') 
WHERE email REGEXP '@domain.xx$'; 
संबंधित मुद्दे