2012-07-25 29 views
0

我知道該怎麼辦好帶有圖案的Mysql重命名多個表

RENAME TABLE onetable_test TO onetable; 

但有一個模式來重命名多個表的方法和不寫很多代碼像

RENAME TABLE onetable_test TO onetable; 
RENAME TABLE twotable_test TO twitable; 
RENAME TABLE threetable_test TO threetable;  
... 

我正在使用mysql。

謝謝!

+0

可能超出了您的問題範圍,但您可以編寫一個腳本來轉儲表列表,在腳本中執行匹配,然後執行'RENAME'。 – 2012-07-25 03:01:18

+0

假設我可以編寫腳本來獲取這些表名稱的列表,那麼我該怎麼做?你能解釋更多嗎?謝謝 – user1550338 2012-07-25 03:11:42

回答

0

例如:

select group_concat(v.name SEPARATOR ' ') 
from (
     select concat('rename table ', t.table_name, ' to ', substring(reverse(v.name), instr(reverse(v.name), '_') + 1, length(v.name)) name 
     from information_schema.tables t 
     where 
      table_schema = 'put_your_table_schema' 
      and table_name like '%_test' 
    ) v; 
  1. 運行此查詢將返回時應該執行重命名的表的腳本。
  2. substring(reverse.....)而不是簡單的replace(v.name, '_test', '')因爲我們需要確保我們只會在字符串的末尾替換_test

希望它可以幫助

3

下面的存儲過程使用::

DELIMITER $$ 

CREATE

PROCEDURE `Rename_Tables`() 

BEGIN 
DECLARE done INT DEFAULT FALSE; 
DECLARE tableName VARCHAR(50); 
DECLARE newTableName VARCHAR(70); 
DECLARE t_query VARCHAR(500); 
DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE '%table_test' AND table_schema='test' ; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

OPEN cur1; 

read_loop: LOOP 
    FETCH cur1 INTO tableName; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    SET newTableName = SUBSTRING(tableName, 1,LOCATE('_',tableName)-1); 
    SET t_query = CONCAT('RENAME TABLE ', tableName, ' TO ', newTableName); 

    SET @myQuery = t_query; 
    PREPARE stmt FROM @myQuery; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END LOOP; 

END$$ 

DELIMITER;

用您的table_schema名稱替換table_schema。

+0

+1好的解釋和格式化的答案。歡迎來到community.Read http://stackoverflow.com/faq瞭解更多詳情。 – 2012-07-25 06:44:02

0

上@ ravnur的回答略有改動:當你想從wp_默認前綴命名您的WordPress表來blog_(例如)

SET group_concat_max_len=5000; 
SELECT group_concat(v.name separator '; ') 
FROM (
    SELECT concat('RENAME TABLE ', t.table_name, ' TO ', replace(t.table_name, 'wp_', 'blog_')) name 
    FROM information_schema.tables t 
    WHERE table_name like 'wp_%' 
) v; 

有用。將該命令的輸出複製並粘貼到mysql shell或phpMyAdmin中。