Обновление адресов электронной почты в MySQL (regexp?)

Языки нуждаются в комментариях. По крайней мере, 95% комментариев могут быть заменены более понятным кодом, но есть все еще предположения, которые вам необходимо документировать, и вам абсолютно необходимо документировать, если есть какие-то внешние проблемы, с которыми вы работаете.

Я никогда не пишу комментарий, не подумав сначала, смогу ли я изменить код, чтобы устранить необходимость в нем, но иногда вы не можете.

6
задан boogie 16 June 2009 в 11:55
поделиться

3 ответа

Вы можете выполнить поиск REGEXP с помощью MySQL , но, к сожалению, он не может вернуть совпавшую часть.

Это возможно сделать. с SQL следующим образом:

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

Вы можете опустить предложение WHERE , но это может привести к неожиданным результатам (например, @ example.xxx.com будет заменено на @ example.yyx.com ), поэтому лучше его оставить.

18
ответ дан 8 December 2019 в 05:23
поделиться

Я бы предпочел сделать это с помощью 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 () , чтобы изменить ограничение памяти для этого сценария.

Заявление об ограничении ответственности: сценарий не протестирован! Не используйте без понимания / тестирования кода (может испортить вашу базу данных).

2
ответ дан 8 December 2019 в 05:23
поделиться

Не проверял, так как mysql не установлен, но кажется, что это может вам помочь

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

PS. Regexp не поможет вам при обновлении, так как он может помочь вам только найти конкретный вход подстроки в строке или проверить всякий раз, когда строка соответствует шаблону. Здесь вы можете найти ссылки на соответствующие функции.

0
ответ дан 8 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: