如何在MySQL数据库中为所有表、所有字段、所有行替换字符串?

9
我有一个Moodle安装包,迁移到另一台服务器上,我需要更改多个引用旧域名的地方。
如何在MySQL中将某个给定数据库中的字符串替换为另一个字符串,搜索所有表格、所有字段和所有行?
我不需要更改字段名称,只需更改值。
相关:如何使用MySQL replace()在多个记录中替换字符串? 但标记为答案的解决方案意味着我需要强制键入表格名称,并且需要对整个数据库执行此操作,而不是手动在每个表格上运行脚本N次。

你最好创建一个新表,然后删除旧表。因为你说的是所有字段中的所有行中的所有表...那不就是整个数据库吗? - bonCodigo
我会尝试编写一个查询,生成一个脚本来为一张表完成所有操作... - ppeterka
@ppeterka:Meta,我喜欢它。但我希望MySQL内置了一些东西。这些天谁知道呢,Postgres有数组字段之类的东西! - sergserg
@bonCodigo 他想要保留这个内容... - ppeterka
@bonCodigo:我想保留内容和结构,只需更改值-通过用值Y替换值X。 - sergserg
3个回答

11

这可能看起来有点……丑陋。但也许可以将数据库简单地转储到SQL/TXT文件中,替换所有字符串,然后使用修改后的转储重新创建数据库。


我把这个作为最后的手段,因为进行mysqldump和导入需要几个小时,因为数据库大约有170GB。 - sergserg
你知道在Linux中,我应该查找哪个命令以便直接从终端替换.sql文件中的文本吗? - sergserg
你觉得使用内置函数做这件事会更快,是什么让你有这种想法呢?无论使用何种工具,全文搜索都是全文搜索。我敢说,在文本文件上使用Linux的sed命令比任何内置工具更快。 //编辑:在我写下这些话之后你发布了你的回复 - ‘sed’就是你要找的 - Dariusz
sed 's/old/new/g' input.txt' backup.sql - 像这样的东西可以工作吗?文档展示了这个例子,将 s 和 g 放在新旧字符串的前后,但并没有说明它们的作用。 - sergserg

5
您可以运行以下代码来创建所有更新语句,以便进行更新。它将在您的数据库中更新每个表中的每个字段。您需要运行此代码,复制结果并运行它们。
警告-请务必在测试环境中测试此操作。您不想有任何不愉快的意外。根据需要进行修改。
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
我会考虑查询INFORMATION_SCHEMA.COLUMNS并动态搜索列和表。尝试创建一个包含数据库中所有列和表的游标:
DECLARE col_names CURSOR FOR
SELECT column_name, table_name
FROM INFORMATION_SCHEMA.COLUMNS

然后遍历每个表中的每个列,并运行动态/预处理SQL以更新字符串所在的位置。

以下是一些很好的帖子,可以帮助您找到正确的方向:

https://dev59.com/0W445IYBdhLWcg3wRoLH#4951354

https://dev59.com/7HVC5IYBdhLWcg3ww0Hr#5728155


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接