复制MySQL表,索引和数据

时间:2010-07-19 09:53:58

标签: mysql

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

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

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

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

这会复制结构和索引, 但不是数据:

create table {new_table} like {old_table};

14 个答案:

答案 0 :(得分:1331)

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

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

要复制结构和数据,请使用以下内容:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

之前我问过这个问题:

Copy a MySQL table including indexes

答案 1 :(得分:43)

除了上述解决方案之外,您还可以使用AS将其设置为一行。

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

答案 2 :(得分:8)

MySQL方式

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

答案 3 :(得分:8)

转到 phpMyAdmin 并选择原始表格,然后在“复制表格到(database.table)”中选择“操作”标签区域选择要复制的数据库,并为新表添加名称。

copy table - phyMyAdmin Screenshot

答案 4 :(得分:2)

我发现了同样的情况,我采取的方法如下:  1.执行SHOW CREATE TABLE:这将为您提供要克隆的表的Create Table语法  2.通过更改表名来运行CREATE TABLE查询以克隆表。

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

答案 5 :(得分:1)

尝试了上面的解决方案。我想出了自己的方式。

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

首先导出数据。

第二次打开导出数据。

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

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

第五次将编辑后的sql数据导入数据库。

答案 6 :(得分:1)

复制表的更好方法是仅使用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 ;

今天天气愉快! 亚历克斯

答案 7 :(得分:0)

扩展this answer可以使用存储过程:

CALL duplicate_table('tableName');

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

SELECT NOW();

结果:

2018-10-22 23:59:59

实施

DELIMITER $$
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 $$
DELIMITER ;

DELIMITER $$
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 $$
DELIMITER ;

DELIMITER $$
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 $$
DELIMITER ;

答案 8 :(得分:0)

尝试

`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列并创建一个新表

答案 9 :(得分:0)

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

nzchar(gsub(paste0("[", connected_elements, "]"), "", containing_elements))
#[1] FALSE FALSE  TRUE  TRUE

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

CREATE TABLE new_table LIKE current_table; 

答案 10 :(得分:0)

要复制表及其结构而没有来自其他数据库的数据,请使用此方法。在新的数据库sql类型上

CREATE TABLE currentdatabase.tablename LIKE olddatabase.tablename

答案 11 :(得分:0)

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

CREATE TABLE IF NOT EXISTS new_table LIKE old_table;

INSERT new_table
SELECT * FROM old_table;

正如之前的答案所说,这将复制结构数据表的所有依赖对象

MySql Tutorial

答案 12 :(得分:0)

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

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

答案 13 :(得分:-3)

FOR MySQL

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

FOR MSSQL 使用MyDatabase

Select * into newCustomersTable  from oldCustomersTable;

此SQL用于复制表,此处oldCustomersTable的内容将复制到newCustomersTable
确保数据库中存在newCustomersTable