【问题标题】:Remove prefix from all mysql table names of a database从数据库的所有mysql表名中删除前缀
【发布时间】:2016-01-30 15:19:53
【问题描述】:

*我想从 MySQL 中的所有表名中删除前缀

我有一个包含 100 多个表的 test 数据库,所以我不想手动处理或重命名每个表。

例如 ci_categories ci_products

预期输出: 类别 产品

我想从所有表中删除前缀,即 ci_

是否有 MySQL 查询来实现这一点?

谢谢 阿米特

【问题讨论】:

标签: mysql


【解决方案1】:

我编写了一个 mysql 存储过程来更改表名,因为没有其他直接的方法可以通过单个查询更改所有表名。

delimiter //
CREATE  PROCEDURE `ChangeTableNameProcedure`()
BEGIN

    DECLARE int_val INT DEFAULT 0;
    DECLARE my_outer_cursor_done INT DEFAULT FALSE; 
    DECLARE my_oldTable VARCHAR(100);
    DECLARE my_newTable VARCHAR(100);

    DECLARE tableNameCursor CURSOR FOR SELECT TABLE_NAME oldName,
    CONCAT(SUBSTRING(TABLE_NAME,POSITION('ci_' IN TABLE_NAME) + 3)) newName
    FROM information_schema.tables 
    WHERE TABLE_SCHEMA = 'YOUR_DATABASE_NAME' AND TABLE_NAME LIKE 'ci_%';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET my_outer_cursor_done = TRUE;



OPEN tableNameCursor;
    OUTER_CURSOR_LOOP: LOOP
            FETCH FROM tableNameCursor INTO my_oldTable,my_newTable;

                    IF my_outer_cursor_done THEN
                        CLOSE tableNameCursor;
                        LEAVE OUTER_CURSOR_LOOP;
                    END IF;
                    SET @old = my_oldTable;
                    SET @new = my_newTable;
                    SET @statement = CONCAT('RENAME TABLE ',@old,' TO ',@new);

                    PREPARE stmt FROM @statement;
                    EXECUTE stmt;
                    DEALLOCATE PREPARE stmt;


                    END LOOP OUTER_CURSOR_LOOP;


    END//

N:B:

  1. 我假设您数据库中的所有表名都有一个前缀 ci_。
  2. 您必须将数据库名称放入 TABLE_SCHEMA= 'YOUR_DATABASE_NAME' 子句。
  3. 请注意,+ 3 代表新表名,其中前三个 字符将被跳过(如果您的旧表名是 'ci_old_table' 那么您的新表名将是“old_table”。注意'ci_'首先 新表名中已跳过三个字符。)
  4. 创建过程后,您需要简单地通过其名称来调用它。 语法是Call ChangeTableNameProcedure();
  5. 请确保在创建过程时您没有忽略 分隔符 //

【讨论】:

  • 不客气。很高兴知道它对你有用。!! :D
猜你喜欢
  • 1970-01-01
  • 2021-06-23
  • 2013-08-19
  • 1970-01-01
  • 2016-02-20
  • 2017-06-12
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
相关资源
最近更新 更多