我有一个已迁移到另一台服务器的 Moodle 安装,我需要更改对旧域的多个引用。
对于搜索所有表、所有字段和所有行的给定数据库,如何将字符串替换为 MySQL 中的另一个字符串?
我不需要更改字段名称,只需更改值。
相关:如何使用 mySQL replace() 替换多条记录中的字符串?
但是标记为答案的解决方案意味着我强烈键入表名,我需要将其触发到整个数据库中,而不是手动处理运行脚本 N 次的每个表。
我有一个已迁移到另一台服务器的 Moodle 安装,我需要更改对旧域的多个引用。
对于搜索所有表、所有字段和所有行的给定数据库,如何将字符串替换为 MySQL 中的另一个字符串?
我不需要更改字段名称,只需更改值。
相关:如何使用 mySQL replace() 替换多条记录中的字符串?
但是标记为答案的解决方案意味着我强烈键入表名,我需要将其触发到整个数据库中,而不是手动处理运行脚本 N 次的每个表。
这可能看起来有点……丑陋。但也许只是将数据库转储到 sql/txt 文件,替换所有字符串并使用修改后的转储重新创建数据库。
您可以运行以下代码来创建执行更新所需的所有 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 字段。您可能需要添加其他数据类型。
我会考虑查询INFORMATION_SCHEMA.COLUMNS
和动态搜索列和表。尝试创建数据库中所有列和表的游标:
DECLARE col_names CURSOR FOR
SELECT column_name, table_name
FROM INFORMATION_SCHEMA.COLUMNS
然后遍历每个表中的每个列并运行动态/准备的 sql 以更新字符串存在的位置。
这里有几个很好的帖子可以让你朝着正确的方向前进: