【发布时间】:2011-06-19 17:59:33
【问题描述】:
我有一个 joomla mysql 数据库,在我的所有表名上都有一个表名前缀“jos_”。但我想从我所有的桌子上删除它。我了解如何重命名每个表,一次一个,但我有 600 个表。是否有一个易于运行的 sql 查询来执行此操作。
如果有人有解决方案,能否请您发布我可以使用的确切 sql 查询?
【问题讨论】:
-
希望这里没有内部依赖!
标签: mysql sql phpmyadmin
我有一个 joomla mysql 数据库,在我的所有表名上都有一个表名前缀“jos_”。但我想从我所有的桌子上删除它。我了解如何重命名每个表,一次一个,但我有 600 个表。是否有一个易于运行的 sql 查询来执行此操作。
如果有人有解决方案,能否请您发布我可以使用的确切 sql 查询?
【问题讨论】:
标签: mysql sql phpmyadmin
您可以使用单个查询生成必要的语句:
select 'RENAME TABLE ' || table_name || ' TO ' || substr(table_name, 5) ||';'
from information_schema.tables
将该查询的输出保存到文件中,您就拥有了所有需要的语句。
或者如果返回 0s 和 1s 而不是语句,这里是使用 concat 的版本:
select concat('RENAME TABLE ', concat(table_name, concat(' TO ', concat(substr(table_name, 5), ';'))))
from information_schema.tables;
【讨论】:
concat,而不是||(无论如何,我的MySQL副本不起作用)。
|| 为我工作(但我在 ANSI 模式下运行我的安装)
|| 返回 0s 和 1s 的人添加了 concat 版本。
【讨论】:
您可以创建自己的存储过程来重命名表,这样您就无需打开外部编辑器,一切都将在服务器上完成:
delimiter //
CREATE PROCEDURE rename_tables( IN db CHAR(255), IN srch CHAR(255), IN rplc CHAR(255) )
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE from_table CHAR(255);
DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=db;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
read_loop: LOOP
IF done THEN
LEAVE read_loop;
END IF;
FETCH cur1 INTO from_table;
SET @to_table = REPLACE(from_table, srch, rplc);
IF from_table != @to_table THEN
SET @rename_query = CONCAT('RENAME TABLE ', db, '.', from_table, ' TO ', @to_table, ';');
PREPARE stmt FROM @rename_query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END LOOP;
CLOSE cur1;
END//
delimiter ;
用法:
CALL rename_tables('test', 'jos_', '');
更新:这是我的第一个 MySQL 存储过程,我遇到了 6 岁老的 bug #5967,这很烦人,你的变量名必须不同于字段名称,因为如果不是,您将在变量中获得 NULL 值。
因此,如果您决定编写 MySQL 存储过程,请注意这一点。
【讨论】: