复制MySQL表、索引和数据

如何复制或克隆或复制数据、结构、和索引的MySQL表到一个新的?

这就是我迄今为止所发现的。

这将复制数据和结构,但不是指数:

create table {new_table} select * from {old_table};

这将复制结构和索引,而不是数据:

create table {new_table} like {old_table};
594122 次浏览

要使用索引和触发器进行复制,请执行以下2个查询:

CREATE TABLE new_table LIKE old_table;INSERT INTO new_table SELECT * FROM old_table;

要复制结构和数据,请使用以下命令:

CREATE TABLE new_table AS SELECT * FROM old_table;

我以前问过这个问题:

复制包含索引的MySQL表

除了上面的解决方案,您还可以使用AS将其放在一行中。

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

formysql

CREATE TABLE newtable LIKE oldtable ;INSERT newtable SELECT * FROM oldtable ;

FORMSSQL使用MyDatabase

Select * into newCustomersTable  from oldCustomersTable;

此SQL用于复制表,此处oldCustmersTable的内容将被复制到newCustomersTable
确保newCustomersTable不要存在于数据库中。

我发现了同样的情况,我采取的方法如下:

  1. 执行SHOW CREATE TABLE <table name to clone>:这将为您提供要克隆的表的Create Table语法
  2. 通过更改表名来运行CREATE TABLE查询以克隆表。

这将创建要与索引一起克隆的表的精确副本。然后您唯一需要的就是重命名索引(如果需要)。

MySQL方式:

CREATE TABLE recipes_new LIKE production.recipes;INSERT recipes_new SELECT * FROM production.recipes;

在我尝试了上面的解决方案之后,我想出了自己的方法。

我的解决方案有点手册,需要DBMS。

首先,导出数据。

第二,开放出口数据。

第三,用新表名替换旧表名。

第四,更改数据中的所有触发器名称(我使用MySQL,当我不更改触发器名称时,它会显示错误)。

第五,将编辑过的SQL数据导入数据库。

转到phpMyAdmin并选择您的原始表,然后在“将表格复制到(database.table)”区域中选择“业务”选项卡。选择要复制的数据库并为新表添加名称。

复制表-ph MyAdmin截图

扩展这个答案可以使用存储过程:

CALL duplicate_table('tableName');

这将导致一个名为tableName_20181022235959的重复表,如果在何时调用

SELECT NOW();

结果:

2018-10-22 23:59:59

实施

DELIMITER $$CREATE PROCEDURE duplicate_table(IN tableName VARCHAR(255))BEGINDECLARE schemaName VARCHAR(255) DEFAULT SCHEMA();DECLARE today VARCHAR(14) DEFAULT REPLACE(REPLACE(REPLACE(NOW(), '-', ''), ' ', ''), ':', ''); -- update @ year 10000DECLARE backupTableName VARCHAR(255) DEFAULT CONCAT(tableName, '_', today);
IF fn_table_exists(schemaName, tableName)THENCALL 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));ELSESELECT CONCAT('ERROR: Table "', tableName, '" does not exist in the schema "', schemaName, '".') AS ErrorMessage;END IF;END $$DELIMITER ;

DELIMITER $$CREATE FUNCTION fn_table_exists(schemaName VARCHAR(255), tableName VARCHAR(255))RETURNS TINYINT(1)BEGINDECLARE totalTablesCount INT DEFAULT (SELECT COUNT(*)FROM information_schema.TABLESWHERE (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 $$DELIMITER ;

DELIMITER $$CREATE PROCEDURE statement(IN dynamic_statement TEXT)BEGINSET @dynamic_statement := dynamic_statement;PREPARE prepared_statement FROM @dynamic_statement;EXECUTE prepared_statement;DEALLOCATE PREPARE prepared_statement;END $$DELIMITER ;

复制表的更好方法是仅使用DDL语句。这样,独立于表中的记录数,您可以立即执行复制。

我的目的是:

DROP TABLE IF EXISTS table_name_OLD;CREATE TABLE table_name_NEW LIKE table_name;RENAME TABLE table_name TO table_name_OLD;RENAME TABLE table_name _NEW TO table_name;

这避免了INSERT AS SELECT语句,即在具有大量记录的表的情况下可能需要时间来执行。

我还建议创建一个PLSQL过程,如下例所示:

DELIMITER //CREATE PROCEDURE backup_table(tbl_name varchar(255))BEGIN-- DROP TABLE IF EXISTS GLS_DEVICES_OLD;SET @query = concat('DROP TABLE IF EXISTS ',tbl_name,'_OLD');PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt;
-- CREATE TABLE GLS_DEVICES_NEW LIKE GLS_DEVICES;SET @query = concat('CREATE TABLE ',tbl_name,'_NEW LIKE ',tbl_name);PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt;
-- RENAME TABLE GLS_DEVICES TO GLS_DEVICES_OLD;SET @query = concat('RENAME TABLE ',tbl_name,' TO ',tbl_name,'_OLD');PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt;
--  RENAME TABLE GLS_DEVICES_NEW TO GLS_DEVICES;SET @query = concat('RENAME TABLE ',tbl_name,'_NEW TO ',tbl_name);PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt;END//DELIMITER ;

祝你有美好的一天!亚历克斯

试试这个:

`CREATE TABLE new-table (id INT(11) auto_increment primary key) SELECT old-table.name, old-table.group, old-table.floor, old-table.age from old-table;`

我从旧表中选择了4列并制作了一个新表。

要创建表结构,请仅使用以下代码:

CREATE TABLE new_table LIKE current_table;

要将数据从表复制到另一个表,请使用以下代码:

INSERT INTO new_table SELECT * FROM current_table;

要在没有来自不同数据库的数据的情况下复制表及其结构,请使用以下命令

CREATE TABLE currentdatabase.tablename LIKE olddatabase.tablename

值得一提的是检查表是否已经存在的重要性想复制它:

CREATE TABLE IF NOT EXISTS new_table LIKE old_table;
INSERT new_tableSELECT * FROM old_table;

正如前面的答案所说,这将复制<修>结构数据数据所有依赖对象的表。

MySql教程

简单克隆:它从另一个表创建一个表,而不考虑任何列属性和索引。

CREATE TABLE new_table SELECT * FROM original_table;

浅层克隆:这只会根据原始表的结构创建一个空表

CREATE TABLE new_table LIKE original_table;

以下命令将在原始表的基础上创建一个空表。

CREATE TABLE adminUsers LIKE users;

深度克隆:这意味着新表可以拥有现有表的每个列和索引的所有属性。如果您想维护现有表的索引和属性,这非常有用。

CREATE TABLE new_table LIKE original_table;
INSERT INTO new_table SELECT * FROM original_table;

https://towardsdatascience.com/how-to-clone-tables-in-sql-dd29586ec89c

// To copy specific column data use this one:CREATE TABLE ut_axis_existrec LIKE ut_karvy_annexure; // To create new table
INSERT INTO ut_axis_existrec(funding_ac,micr_no, warrant_no,amount,invname,mfundcode,funding_dt,status,remarks1,amc_remark,created_at)SELECTt1.funding_ac,t1.micr_no,t1.warrant_no,t1.amount,t1.invname,t1.mfund_code,t1.funding_dt,t1.status,t1.remarks1,t1.created_atfrom ut_axis_karvyinner joinut_axis_karvy_master as t2on t1.micr_no = t2.micr_no;