如何为所有行中所有字段中的所有表替换 MySQL 数据库中的字符串?
Posted
技术标签:
【中文标题】如何为所有行中所有字段中的所有表替换 MySQL 数据库中的字符串?【英文标题】:How can I replace a string in a MySQL database for all tables in all fields in all rows? 【发布时间】:2012-12-23 16:27:34 【问题描述】:我有一个已迁移到另一台服务器的 Moodle 安装,我需要更改对旧域的多个引用。
如何在 mysql 中为给定数据库替换一个字符串为另一个字符串搜索所有表、所有字段和所有行?
我不需要更改字段名称,只需更改值。
相关:How can I use mySQL replace() to replace strings in multiple records?
但标记为答案的解决方案意味着我强烈键入表名,我需要将其触发到整个数据库中,而不是手动处理运行脚本 N 次的每个表。
【问题讨论】:
您宁愿创建一个新表然后...删除旧表...正如您所说的所有行中所有字段中的所有表...这实际上是一个完整的数据库不是吗? 我会尝试编写一个查询来生成脚本,该脚本会针对表执行一次查询... @ppeterka:Meta,我喜欢。但我希望 MySQL 有内置的东西。谁知道这些天,Postgres 有数组字段等等! @bonCodigo 他想保留内容... @bonCodigo:我想保留内容和结构。只需更改值 - 将值 X 替换为值 Y。 【参考方案1】:我会考虑查询INFORMATION_SCHEMA.COLUMNS
并动态搜索列和表。尝试创建数据库中所有列和表的游标:
DECLARE col_names CURSOR FOR
SELECT column_name, table_name
FROM INFORMATION_SCHEMA.COLUMNS
然后遍历每个表中的每个列并运行动态/准备好的 sql 来更新字符串存在的位置。
这里有几篇很好的帖子可以让你找到正确的方向:
https://***.com/a/4951354/1073631
https://***.com/a/5728155/1073631
【讨论】:
【参考方案2】:您可以运行以下代码来创建执行更新所需的所有 udpate 语句。它将更新数据库中每个表中的每个字段。您需要运行此代码,然后复制结果并运行它们。
警告 - 请务必在测试环境中进行测试。你不想要任何不愉快的惊喜。根据需要进行修改。
SELECT concat('UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, ' = REPLACE(', COLUMN_NAME, ', ''STRING_TO_REPLACE'', ''REPLACE_STRING'')')
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE TABLE_SCHEMA = 'YOUR_DATABASE_NAME'
AND DATA_TYPE IN ('char', 'varchar')
;
我将其限制为仅 char 和 varchar 字段。您可能需要添加其他数据类型。
【讨论】:
【参考方案3】:这可能看起来有点……丑陋。但也许只是将数据库转储到 sql/txt 文件,替换所有字符串并使用修改后的转储重新创建数据库。
【讨论】:
我有这个作为最后的手段,执行 mysqldump 和导入将需要几个小时,因为数据库大约 170GB 大。 你知道我应该在 Linux 上使用什么命令直接从终端替换 .sql 文件中的文本吗? 是什么让您认为使用内置函数会更快?无论使用何种工具,全文搜索都是如此。我敢说在文本文件上使用 linux sed 会比任何内置工具都快。 //编辑:你在我写完后发布 - 'sed' 就是你要找的sed 's/old/new/g' input.txt' backup.sql
- 这样的东西有用吗?文档显示了这个例子,新旧字符串的前后都有 s 和 g,但没有提到它们的作用?以上是关于如何为所有行中所有字段中的所有表替换 MySQL 数据库中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章