如何在MySQL数据库中替换所有行中所有字段中的所有表?

时间:2013-01-09 15:12:53

标签: mysql sql replace records

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

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

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


相关:How can I use mySQL replace() to replace strings in multiple records?

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

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

然后遍历每个表中的每个列,并运行dynamic / prepared sql来更新字符串所在的位置。

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

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

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

答案 2 :(得分: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字段。您可能需要添加其他数据类型。