【问题标题】:How I can change prefixes in all tables in my MySQL DB?如何更改 MySQL DB 中所有表的前缀?
【发布时间】:2011-01-28 19:05:23
【问题描述】:

我的提供程序安装到我的站点 Drupal CMS。现在我需要从旧站点复制所有数据。我的旧数据库中有没有前缀的表,但在新数据库中,所有表都有 dp_[table_name] 前缀。

【问题讨论】:

    标签: mysql database prefix


    【解决方案1】:
    SET @database   = "Database-Name-Here";
    SET @old_prefix = "wp_";
    SET @new_prefix = "ab_";
       SELECT
        CONCAT(
            "RENAME TABLE ",
            @database,
            ".",
            TABLE_NAME,
            " TO ",
            @database,
            ".",
            CONCAT(@new_prefix, TRIM(LEADING @old_prefix FROM TABLE_NAME)),
            ';'
        ) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
    

    "Database-Name-Here" 替换为您的数据库名称,将 "wp_" 替换为旧前缀,以及 "ab_" 带有新的前缀。 前面的代码会产生对 MySQL DB 的查询,同样,上面代码创建的查询用单引号括起来,必须替换。但是,如果您使用的是 WordPress,则需要执行更多步骤,否则您的网站将被破坏。在上述代码创建的查询之后,必须执行以下查询。

    update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_capabilities' where meta_key = 'OLDPREFIX_capabilities';
    update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_user_level' where meta_key = 'OLDPREFIX_user_level';
    update NEWPREFIX_usermeta set meta_key = 'NEWPREFIX_autosave_draft_ids' where meta_key = 'OLDPREFIX_autosave_draft_ids';
    update NEWPREFIX_options set option_name = 'NEWPREFIX_user_roles' where option_name = 'OLDPREFIX_user_roles'
    

    "NEWPREFIX" 替换为新前缀,"OLDPREFIX" 替换为旧前缀。

    【讨论】:

      【解决方案2】:

      只是稍微修改了一下,以解决前缀也在表名中的情况。

      SET @database   = "database_name"; 
      SET @old_prefix = "old_prefix_"; 
      SET @new_prefix = "new_prefix_";
         SELECT
          CONCAT(
              "RENAME TABLE ",
              TABLE_NAME,
              " TO ",
              CONCAT(@new_prefix, TRIM(LEADING @old_prefix FROM TABLE_NAME)),
              ';'
          ) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
      

      【讨论】:

        【解决方案3】:

        如果有人想知道如何做到这一点(因为它对我的其他选项不起作用),您可以运行它(当然,将前三个变量更改为您的值):

        SET @database   = "database_name"; 
        SET @old_prefix = "old_prefix_"; 
        SET @new_prefix = "new_prefix_";
           SELECT
            concat(
                "RENAME TABLE ",
                TABLE_NAME,
                " TO ",
                replace(TABLE_NAME, @old_prefix, @new_prefix),
                ';'
            ) AS "SQL" FROM information_schema.TABLES WHERE TABLE_SCHEMA = @database;
        

        然后会提示您进行一系列查询,以便更改数据库中的所有表。你只需要复制它,运行它,瞧!

        【讨论】:

          【解决方案4】:

          PhpMyAdmin 允许您现在执行此操作。在“数据库”级别选择结构选项卡以查看所有表。单击“检查所有”(在表格列表下方)。在“With selected”下拉菜单中选择:“Replace table prefix”。

          【讨论】:

          • 这应该是公认的答案
          【解决方案5】:

          zerkms 解决方案对我不起作用。我必须指定information_schema 数据库才能查询Tables 表。

          SELECT 
              CONCAT('RENAME TABLE ', GROUP_CONCAT('`', TABLE_SCHEMA, '`.`', TABLE_NAME, '` TO `', TABLE_SCHEMA, '`.`prefix_', TABLE_NAME, '`')) AS q
          FROM 
              `information_schema`.`Tables` WHERE TABLE_SCHEMA='test';
          

          编辑:

          优化查询,只调用一次 RENAME TABLE。我遇到的事实是,连接的输出被截断为 341 个字符。这可以通过将 MySQL 变量 group_concat_max_len 设置为更高的值来解决(如果您的服务器允许):

          SET group_concat_max_len = 3072; -- UTF8 assumes each character will take 3 bytes, so 3072/3 = 1024 characters.
          

          【讨论】:

          • 没错,这对我有用,因为我正在使用 Joomla 处理 localhost XAMPP,我想更改为自动 Joomla 前缀。我按照您的步骤操作 - 我必须像您一样指定 information_schema.Tables 并设置 SET group_concat_max_len = 10240;就我而言,因为有很多桌子。 +1
          • 还有一点,您可以使用相同的命令跨数据库移动表(例如 backup_db),例如:SELECT CONCAT('RENAME TABLE ',TABLE_NAME,' TO backup_db.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'testbot';
          • 关于group_concat_max_len 变量的编辑非常重要!我也没有得到完整的句子,效果很好!
          【解决方案6】:

          编写一个脚本,为每个表运行 RENAME TABLE。

          SELECT 
            GROUP_CONCAT('RENAME TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` TO `', TABLE_SCHEMA, '`.`prefix_', TABLE_NAME, '`;' SEPARATOR ' ')
          FROM 
            `TABLES` WHERE `TABLE_SCHEMA` = "test";
          

          其中“test”是预期的数据库名称

          在此之后,您可以进行长查询,如果您执行它将添加前缀;-)

          【讨论】:

            【解决方案7】:

            您可以简单地转储数据库,使用文本编辑器打开转储,将所有出现的“CREATE TABLE”替换为“CREATE TABLE dp_”并恢复数据库。这需要几分钟的时间。

            【讨论】:

            • 直到数据库小于几千兆字节;-)
            • 我是游戏。 :) 对于大于 GB 的数据库,使用查询工具(例如 SQL Workbench),选择表列表中的所有表,将内容复制到电子表格的 A 列(在我的情况下为 Calc)并输入以下内容B列中的公式:="重命名表" & A1 & " to dp_" & A1 & ";"将单元格 B1 中的公式粘贴到每个其他 B 列单元格中,重命名脚本出现在 B 列中!
            • 正如我在回答中所说的 - 重命名的适当方法是使用 RENAME TABLE (+ information_shema 来检索表名)
            • 或者你可以只使用 eclipse 并用“CREATE TABLE dp_”替换所有“CREATE TABLE”
            • @Pooya 当然,你是对的,但我不认为将方法扩展到涵盖这些方面会做太多工作。这不会像我上面描述的那样是 2 分钟的工作,但可能会在 10-15 分钟内完成,坚持上述使用 DDL/DML SQL 脚本实现整体命名更改的原则。
            猜你喜欢
            • 1970-01-01
            • 2011-12-19
            • 2013-04-26
            • 2015-02-17
            • 2014-07-20
            • 2018-12-26
            • 1970-01-01
            • 2016-08-25
            • 2023-03-31
            相关资源
            最近更新 更多