8

我有一个已迁移到另一台服务器的 Moodle 安装,我需要更改对旧域的多个引用。

对于搜索所有表、所有字段和所有行的给定数据库,如何将字符串替换为 MySQL 中的另一个字符串?

我不需要更改字段名称,只需更改值。


相关:如何使用 mySQL replace() 替换多条记录中的字符串?

但是标记为答案的解决方案意味着我强烈键入表名,我需要将其触发到整个数据库中,而不是手动处理运行脚本 N 次的每个表。

4

3 回答 3

9

这可能看起来有点……丑陋。但也许只是将数据库转储到 sql/txt 文件,替换所有字符串并使用修改后的转储重新创建数据库。

于 2013-01-09T15:17:16.207 回答
5

您可以运行以下代码来创建执行更新所需的所有 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 字段。您可能需要添加其他数据类型。

于 2013-01-09T15:31:13.820 回答
3

我会考虑查询INFORMATION_SCHEMA.COLUMNS和动态搜索列和表。尝试创建数据库中所有列和表的游标:

DECLARE col_names CURSOR FOR
SELECT column_name, table_name
FROM INFORMATION_SCHEMA.COLUMNS

然后遍历每个表中的每个列并运行动态/准备的 sql 以更新字符串存在的位置。

这里有几个很好的帖子可以让你朝着正确的方向前进:

https://stackoverflow.com/a/4951354/1073631

https://stackoverflow.com/a/5728155/1073631

于 2013-01-09T15:24:27.823 回答