我有 5 个数据库(或模式),它们在 MySQL 中有超过 100 个表,现在我需要创建新的数据库,其中的表与旧表类似。 新表的名称采用这种格式
"OldDatabaseName"_"OldTableName"_History
它们的列几乎相同,只是我需要为每个表添加 2 个新列,如 START 和 END 时间戳。
新表中不会有任何外键,也不会有任何自增列,只有 ID 和 START 列将是唯一键。
那么,为此我需要使用什么样的 SQL?
最佳答案
“有没有解决这个问题的循环?” 是的。
编写存储过程并:
声明变量、游标和 Exception_Handler(我们使用 Exception_Handler 来寻找循环的导出点)
从 information_schema.tables 加载所有 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;
具有原始表所有属性的空表(以备不时之需):
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_names 列表。 这将比运行该过程花费更多的时间,但与编写和测试该过程相比,对于初学者来说仍然更快。
我推荐存储过程方法
关于Mysql像其他表一样创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36718397/