Wolałbym zrobić to z PHP, jeśli to możliwe. Mysql niestety nie pozwala na przechwytywanie pasujących części w wyrażeniach regularnych. Albo jeszcze lepiej: można połączyć dwa tak, na przykład:
$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");
Należy zauważyć, że rozwiązanie to zajmie trochę czasu i może zabraknąć pamięci lub uderzyć limity wykonanie jeśli masz wiele wpisów w bazie danych . Możesz zajrzeć do ignore_user_abort()
i ini_set()
, aby zmienić limit pamięci dla tego skryptu.
Nota prawna: Skrypt nie został przetestowany! Nie używaj bez zrozumienia/testowania kodu (może zepsuć bazę danych).