Я бы предпочел сделать это с 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()
изменить ограничение памяти для этого скрипта.
Отказ от ответственности: скрипт не проверен! Не используйте без понимания / тестирования кода (может испортить ваш db).