Обновление адресов электронной почты в MySQL (regexp?) - PullRequest
6 голосов
/ 16 июня 2009

Есть ли способ обновить каждый адрес электронной почты в MySQL с помощью regexp? Что я хочу сделать, это изменить адреса что-то@domain.xx на что-то@domain.yy. Можно ли делать с SQL или я должен делать это с PHP, например?

Спасибо!

Ответы [ 4 ]

18 голосов
/ 16 июня 2009

Вы можете искать 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), поэтому лучше оставить его.

3 голосов
/ 10 мая 2014
UPDATE tableName
SET email = CONCAT(SUBSTRING(email, 1, locate('@',email)), 'domain.yy')
WHERE email REGEXP '@domain.xx$';
2 голосов
/ 16 июня 2009

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

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

0 голосов
/ 16 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...