我的所有表名都有一个joomla mysql数据库,表名前缀为“jos_”。但是我想把它从我的所有表中删除。我理解如何重命名每个表,一次一个,但我有600个表。是否有一个易于运行的SQL查询来执行此操作。
如果有人有解决方案,请您发布我可以使用的确切sql查询吗?
答案 0 :(得分:14)
您可以使用单个查询生成必要的语句:
select 'RENAME TABLE ' || table_name || ' TO ' || substr(table_name, 5) ||';'
from information_schema.tables
将该查询的输出保存到文件中,并且您拥有所需的所有语句。
或者如果它返回0
和1
而不是状态网,则使用concat
的版本为:
select concat('RENAME TABLE ', concat(table_name, concat(' TO ', concat(substr(table_name, 5), ';'))))
from information_schema.tables;
答案 1 :(得分:12)
答案 2 :(得分:3)
您可以创建自己的存储过程来重命名表,而不需要打开外部编辑器,所有内容都将在服务器上完成:
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存储过程,请注意这一点。