我有一个Moodle安装,我迁移到另一台服务器,我需要更改对旧域的几个引用。
如何在MySQL中为给定数据库替换另一个字符串的字符串搜索所有表,所有字段和所有行?
我不需要更改字段名称,只需更改值。
相关:How can I use mySQL replace() to replace strings in multiple records?
但标记为答案解决方案意味着我强烈输入表名,我需要将其解压缩到整个数据库中,而不是手动处理运行该脚本N次的每个表。
答案 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来更新字符串所在的位置。
以下是一些很好的帖子,可以帮助您找到正确的方向:
答案 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字段。您可能需要添加其他数据类型。