Preferiría hacerlo con PHP, si es posible. Mysql lamentablemente no permite capturar partes coincidentes en expresiones regulares. O mejor aún: puede combinar las dos cosas de este tipo, por ejemplo:
$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");
Tenga en cuenta que esta solución tomará bastante tiempo y que puede quedarse sin memoria o golpear los límites de ejecución si tiene muchas entradas en la base de datos . Es posible que desee consultar ignore_user_abort()
y ini_set()
para cambiar el límite de memoria de este script.
Descargo de responsabilidad: ¡Script not tested! No lo use sin entender/probar el código (podría estropear su db).