2016-04-19 46 views
1

我有5個數據庫(或模式),其中有超過100個表在MySQL中,現在我需要創建新的數據庫,有像老表一樣的表。 新表的名字都是這種格式Mysql創建表像其他表

「OldDatabaseName」 _ 「OldTableName」 _history

及其列幾乎一樣,只是我需要添加像START 2個新列和END每個表的時間戳。

不會有新表的任何外鍵,也沒有任何自動遞增列,只是ID和START列將是唯一的關鍵。

那麼,我需要什麼樣的SQL來達到這個目的?

+1

第1課:對每個數據庫/模式的腳本文件,以便能夠重新創建或複製創建數據庫。 – jarlh

回答

1

「有沒有通過解決方案的任何循環?」 是的。

寫一個存儲過程和:

  • 聲明變量,光標和Exception_Handler(我們使用Exception_Handler找到我們的循環的退出點)從INFORMATION_SCHEMA

  • 加載所有schema_names/table_names。表格
    應該被複制到遊標中(遊標允許我們將
    數據提取到變量中,以便我們可以在我們的語句中使用它們)。

  • 之後,您可以在循環中使用schema_names/table_names來創建新架構中每個表的 副本。只需將schema_name和 table_name獲取到變量中,並使用預準備語句創建 表。每個貫穿一個表格都將在 循環內創建。一旦創建了所有表格,就會發生異常,以告知 您沒有更多數據。

的人指出:

  • 空表,無按鍵:

    create table new_schema_name.new_table_name 
    select * from old_schema_name.old_table_name limit 0; 
    
  • 填寫表格,無按鍵(包括原始表的所有數據):

    create table new_schema_name.new_table_name 
    select * from old_schema_name.old_table_name; 
    
  • 空表w ITH(其需要的情況下)的原始表的所有屬性:

    create table new_schema_name.new_table_name 
    like old_schema_name.old_table_name ; 
    

如果你有小表(< 500萬條記錄[還取決於硬件]),你不想重複這項工作,您可以使用GUI通過拖放來複製表格。 Navicat for MySQL支持這個功能。 之後,您可以使用texteditor + excel構建您的alter命令來調整表名並添加新列。可以從information_schema.tables中選擇table_name的列表。 與運行程序相比,這需要更多的時間,但與編寫和測試程序相比,初學者應該更快。

我推薦的存儲過程方法

1

首先使用這一個

create table new_table select * from old_table; 

創建表,然後使用alter table查詢來改變你的願望

+0

有沒有通過解決方案的任何循環?我的意思是喜歡得到所有模式,併爲這些模式中的每個表運行這一行的SQL? – kadir

+0

小心,thiis不會重複從原始表(至少與MyISAM)的PK,FK和索引 – Preuk

+0

@Preuk其實這正是我想要的,感謝警告 – kadir

1

鑑於最近的評論,最好的答案似乎是放棄使用mysqldump表,修改再輸入CREATE TABLEINSERT之前輸出中的表名。然後你可以根據自己的喜好ALTER TABLEUPDATE這個新的tablea。