有没有办法用regexp更新MySQL中的每个电子邮件地址?我想要做的是将something@domain.xx地址更改为something@domain.yy。是否可以使用SQL,或者我应该使用PHP?
谢谢!
答案 0 :(得分: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
),因此最好将其保留。
答案 1 :(得分:3)
UPDATE tableName
SET email = CONCAT(SUBSTRING(email, 1, locate('@',email)), 'domain.yy')
WHERE email REGEXP '@domain.xx$';
答案 2 :(得分: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()
以更改此脚本的内存限制。
免责声明:脚本未经测试!不要在不理解/测试代码的情况下使用(可能会破坏你的数据库)。
答案 3 :(得分:0)
没有检查,因为没有安装mysql,但似乎它可以帮助你
update table_name
set table_name.email = substr(table_name.email, 0, position("@" in table_name.email) + 1)
+ "new_domain";
PS。 Regexp不会帮助您进行更新,因为它只能帮助您在字符串匹配模式时查找字符串中的子字符串的特定入口。 Here您可以找到相关功能的参考。