如何在 MySQL 中运行更新查询并替换匹配的字符串
Posted
技术标签:
【中文标题】如何在 MySQL 中运行更新查询并替换匹配的字符串【英文标题】:How do I run Update Query in MySQL and replace a matching string 【发布时间】:2017-09-25 21:16:16 【问题描述】:我尝试了几件事,但它从列中删除了完整的内容。
这就是我想要做的 - 我的 mysql 数据库中的一个特定表 [abc_tablename] 有一个列 [xyz_columnname] 有很多电子邮件 ID(超过 5000 个),我希望他们用一个text [已删除电子邮件 ID]
我对 SELECT 使用了以下查询:
SELECT *
FROM abc_tablename
WHERE xyz_columnname LIKE '%@%'
在这种情况下如何执行替换功能?你能帮我查询同样的问题吗?我试过了,但它从 xyz_columnname 中删除了所有数据
UPDATE abc_tablename
SET xyz_columnname = REPLACE ( xyz_columnname, LIKE ''%@%'', '**email ID removed**');
我正在使用 phpMyAdmin 来运行这些查询。另外,请注意 xyz_columnname 包含大量文本和数字内容以及电子邮件 ID。
【问题讨论】:
SQL UPDATE with LIKE的可能重复xyz_columnname
中的值只是一个电子邮件地址,没有别的吗?或者它是一堆其他文本(如blah blah test@example.com blah
)中的一个电子邮件地址,而您只想替换该文本中的电子邮件?如果是这种情况,您可能需要使用正则表达式来执行替换。 Mysql 没有内置的正则表达式替换功能,因此您需要使用 php 之类的东西并对其进行更新或定义 regexp_replace 的 udf 版本(那里有几个)。
@JonathanKuhn 你说得对。 xyz_columnname 包含大量文本和数字内容以及电子邮件 ID。
@ravichopra,好吧,就像我上面说的,mysql 没有开箱即用的能力来进行模式匹配和替换。您要么需要使用 php 和 preg_replace 之类的其他东西来提取所有类似 %@%
的行,修复它们并一次更新行,要么在 mysql 中实现许多 regexp_replace 用户定义的函数之一使用它。后者可能会更高效,但如果您将其作为一次性的事情,只需使用 php 以更简单的方式强制它,并且在将来,在插入之前修复它。
【参考方案1】:
您可以简单地使用此命令,这将更新所有行,其中列xyz_columnname
包含@
以显示email ID Removed
UPDATE abc_tablename
SET `xyz_columnname` = 'email ID removed'
WHERE `xyz_columnname` LIKE '%@%'
使用`(反引号)作为列名
使用 ' 或 " 表示值
不要对列值使用反引号。使用单引号或双引号,否则 mysql 会将该值视为列名。
【讨论】:
即使 xyz_columnname 包含大量文本和数字内容以及电子邮件 ID,这是否有效? 不,这仅在xyz_columnname
仅包含电子邮件地址时才有效。您在问题中没有明确表示xyz_columnname
包含多种类型的信息。这不是 SQL 的最佳实践,您应该为每个值使用单独的列。以上是关于如何在 MySQL 中运行更新查询并替换匹配的字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何用另一个表中的匹配值替换/更新列中每个字符串的所有实例?