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

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

Благодаря!

sql,mysql,regex,

6

Ответов: 4


18 ов принято

Вы можете искать 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
UPDATE tableName
SET email = CONCAT(SUBSTRING(email, 1, locate('@',email)), 'domain.yy')
WHERE email REGEXP '@domain.xx$';

2

Я бы предпочел сделать это с 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).


0

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

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

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

SQL, MySQL, регулярное выражение,