【问题标题】:Replace MySQL values in over 120 tables替换 120 多个表中的 MySQL 值
【发布时间】:2012-12-16 18:55:39
【问题描述】:

我们已将巨大的互联网服务从 .de 域重定向到 .com 域 - 这是讨论板 (vBulletin)。目前我们需要将“domainame.de”等所有短语更改为“domainame.com”:

  • 超过 120 个表格(帖子、主题)
  • 很多 MySQL 字段

任何人有建议如何做这样的事情?我们需要将字符串“domainame.de”替换为“domainname.com” - 无处不在。

【问题讨论】:

  • 写个脚本来做?您需要遍历每个表、行和列。当然,在对实时数据执行此操作之前,您应该在副本上尝试以确保它运行正常。您需要做出决定,具体取决于运行需要多长时间,是否可以在实时数据库上运行这样的脚本(因为在脚本运行时您将拥有混合域),或者是否你需要有停机时间。顺便说一句,我会使用 PHP 或类似的脚本语言。
  • @halfer:等等,你是说没有特殊的 SQL 命令可以完成这一切吗? :)
  • @SergioTulentsev - 我讨厌成为坏消息的传播者:p

标签: mysql regex replace vbulletin


【解决方案1】:

您想做的事情听起来很危险,因为它可能会出现一些误报,并无意中改变事情。假设您的旧域是“acme.de”,新域是“acme.com”,并且一些随机访问者发布了以下内容(这是一个过于简化的示例):

我喜欢与 Acme 一起工作。取决于我的心情。

很容易将其转换为:

我喜欢使用 Acme.compending 来调整我的心情。

因此,我的建议,按优先顺序排列:

  1. 根本不更新数据库,只需将您的 Web 服务器配置为将 .de 流量重定向到 .com 流量即可。这样你就不太可能犯错。

  2. 如果您必须更新讨论区,请在您的显示逻辑中进行,而不是在数据库中进行 - 这样您就没有机会犯不可挽回的错误。

  3. 用 perl 或您最喜欢的文本处理语言语言编写一个脚本,该语言对每个表/字段进行正则表达式替换。我建议以下策略:

    一个。做一个SELECT id,<field name> FROM <table> WHERE <field name> LIKE '%domain.de%'

    b.以 CSV 或其他易于解析的格式存储输出。

    c。运行您的正则表达式脚本,将 domain.de 更改为 domain.com

    d。检查输出。

    e。使用脚本的输出执行UPDATE <table> SET <field>=? WHERE id=?

    首先分小块进行(一次几十或几百个帖子),并在将更改提交到数据库之前目视检查结果,以确保您没有出错。

【讨论】:

    【解决方案2】:

    我不知道这是否适合你,但看看这个

    以下查询将为您提供表列表(120 个表)

       SELECT DISTINCT table_name
       FROM
       (
         SELECT *
         FROM information_schema.`COLUMNS` C
       ) t1
       WHERE TABLE_SCHEMA='schema_name'
    

    下一个 您可以对每个表使用 UPDATE 查询。你可以使用CURSORS 来实现这一点

    我不擅长游标,但我认为在这种情况下会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2021-01-01
      • 2015-03-05
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2021-07-12
      相关资源
      最近更新 更多