如何为所有行中所有字段中的所有表替换 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 数据库中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 MongoDB 集合中的所有文档选择单个字段?

mysql怎样查询一个表中所有数据

如何为多个参数值显示特定字段中的所有值? SQL Server 报表生成器

更新表中所有行中的一列

如何为SQL Server数据库中的所有表创建触发器

如何为mysql中的每条记录检索表中的两条记录