Языки нуждаются в комментариях. По крайней мере, 95% комментариев могут быть заменены более понятным кодом, но есть все еще предположения, которые вам необходимо документировать, и вам абсолютно необходимо документировать, если есть какие-то внешние проблемы, с которыми вы работаете.
Я никогда не пишу комментарий, не подумав сначала, смогу ли я изменить код, чтобы устранить необходимость в нем, но иногда вы не можете.
Вы можете выполнить поиск 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
), поэтому лучше его оставить.
Я бы предпочел сделать это с помощью 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 ()
, чтобы изменить ограничение памяти для этого сценария.
Заявление об ограничении ответственности: сценарий не протестирован! Не используйте без понимания / тестирования кода (может испортить вашу базу данных).
Не проверял, так как mysql не установлен, но кажется, что это может вам помочь
update table_name
set table_name.email = substr(table_name.email, 0, position("@" in table_name.email) + 1)
+ "new_domain";
PS. Regexp не поможет вам при обновлении, так как он может помочь вам только найти конкретный вход подстроки в строке или проверить всякий раз, когда строка соответствует шаблону. Здесь вы можете найти ссылки на соответствующие функции.