如何将MySQL表的数据,结构和索引复制/克隆/复制到新表?
这是我到目前为止所发现的 .
这将复制数据和结构,但不复制索引:
create table {new_table} select * from {old_table};
这将复制结构和索引,但不复制数据:
create table {new_table} like {old_table};
经过上面的解决方案 . 我想出了自己的方式 .
我的解决方案有点手动,需要DBMS .
首先导出数据 .
第二次打开导出数据 .
第三个用新表名替换旧表名 .
第四个更改数据中的所有触发器名称(我使用mysql,当我不更改触发器名称时显示错误)
第五步将编辑后的sql数据导入数据库 .
转到 phpMyAdmin 并选择原始表格,然后在“ Copy table to (database.table) ”区域中选择“ Operations ”选项卡,选择要复制的数据库并为新表添加名称 .
对于MySQL
CREATE TABLE newtable LIKE oldtable ; INSERT newtable SELECT * FROM oldtable ;
FOR MSSQL使用 MyDatabase :
MyDatabase
Select * into newCustomersTable from oldCustomersTable;
这个SQL用于复制表,这里oldCustomersTable的内容将被复制到 newCustomersTable .确保数据库中不存在 newCustomersTable .
newCustomersTable
我发现了相同的情况,我采取的方法如下:1 . 执行SHOW CREATE TABLE:这将为您提供要克隆的表的Create Table语法2.通过更改表名运行CREATE TABLE查询克隆表 .
这将创建要与索引一起克隆的表的精确副本 . 您需要的唯一事情是重命名索引(如果需要) .
扩展this answer可以使用存储过程:
CALL duplicate_table('tableName');
这将导致重复的表名为 tableName_20181022235959 如果调用时
tableName_20181022235959
SELECT NOW();
结果:
2018-10-22 23:59:59
CREATE PROCEDURE duplicate_table(IN tableName VARCHAR(255)) BEGIN DECLARE schemaName VARCHAR(255) DEFAULT SCHEMA(); DECLARE today VARCHAR(14) DEFAULT REPLACE(REPLACE(REPLACE(NOW(), '-', ''), ' ', ''), ':', ''); -- update @ year 10000 DECLARE backupTableName VARCHAR(255) DEFAULT CONCAT(tableName, '_', today); IF fn_table_exists(schemaName, tableName) THEN CALL statement(CONCAT('CREATE TABLE IF NOT EXISTS ', backupTableName,' LIKE ', tableName)); CALL statement(CONCAT('INSERT INTO ', backupTableName,' SELECT * FROM ', tableName)); CALL statement(CONCAT('CHECKSUM TABLE ', backupTableName,', ', tableName)); ELSE SELECT CONCAT('ERROR: Table "', tableName, '" does not exist in the schema "', schemaName, '".') AS ErrorMessage; END IF; END ;
CREATE FUNCTION fn_table_exists(schemaName VARCHAR(255), tableName VARCHAR(255)) RETURNS TINYINT(1) BEGIN DECLARE totalTablesCount INT DEFAULT ( SELECT COUNT(*) FROM information_schema.TABLES WHERE (TABLE_SCHEMA COLLATE utf8_general_ci = schemaName COLLATE utf8_general_ci) AND (TABLE_NAME COLLATE utf8_general_ci = tableName COLLATE utf8_general_ci) ); RETURN IF( totalTablesCount > 0, TRUE, FALSE ); END ;
CREATE PROCEDURE statement(IN dynamic_statement TEXT) BEGIN SET @dynamic_statement := dynamic_statement; PREPARE prepared_statement FROM @dynamic_statement; EXECUTE prepared_statement; DEALLOCATE PREPARE prepared_statement; END ;
除了上面的解决方案,您可以使用 AS 将其设置为一行 .
AS
CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
MySQL方式
CREATE TABLE recipes_new LIKE production.recipes; INSERT recipes_new SELECT * FROM production.recipes;
要使用索引和触发器复制,请执行以下两个查询:
CREATE TABLE newtable LIKE oldtable; INSERT newtable SELECT * FROM oldtable;
要只复制结构和数据,请使用以下方法:
我之前问过这个:
Copy a MySQL table including indexes
8 回答
经过上面的解决方案 . 我想出了自己的方式 .
我的解决方案有点手动,需要DBMS .
首先导出数据 .
第二次打开导出数据 .
第三个用新表名替换旧表名 .
第四个更改数据中的所有触发器名称(我使用mysql,当我不更改触发器名称时显示错误)
第五步将编辑后的sql数据导入数据库 .
转到 phpMyAdmin 并选择原始表格,然后在“ Copy table to (database.table) ”区域中选择“ Operations ”选项卡,选择要复制的数据库并为新表添加名称 .
对于MySQL
FOR MSSQL使用
MyDatabase
:这个SQL用于复制表,这里oldCustomersTable的内容将被复制到
newCustomersTable
.确保数据库中不存在
newCustomersTable
.我发现了相同的情况,我采取的方法如下:1 . 执行SHOW CREATE TABLE:这将为您提供要克隆的表的Create Table语法2.通过更改表名运行CREATE TABLE查询克隆表 .
这将创建要与索引一起克隆的表的精确副本 . 您需要的唯一事情是重命名索引(如果需要) .
扩展this answer可以使用存储过程:
这将导致重复的表名为
tableName_20181022235959
如果调用时结果:
实施
除了上面的解决方案,您可以使用
AS
将其设置为一行 .MySQL方式
要使用索引和触发器复制,请执行以下两个查询:
要只复制结构和数据,请使用以下方法:
我之前问过这个:
Copy a MySQL table including indexes