首页 文章

复制MySQL表,索引和数据

提问于
浏览
543

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

这是我到目前为止所发现的 .

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

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

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

create table {new_table} like {old_table};

8 回答

  • 6

    经过上面的解决方案 . 我想出了自己的方式 .

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

    首先导出数据 .

    第二次打开导出数据 .

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

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

    第五步将编辑后的sql数据导入数据库 .

  • 1207

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

    copy table - phyMyAdmin Screenshot

  • 43

    对于MySQL

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

    FOR MSSQL使用 MyDatabase

    Select * into newCustomersTable  from oldCustomersTable;
    

    这个SQL用于复制表,这里oldCustomersTable的内容将被复制到 newCustomersTable .
    确保数据库中不存在 newCustomersTable .

  • 5

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

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

  • -3

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

    CALL duplicate_table('tableName');
    

    这将导致重复的表名为 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
    ;
    
  • 1

    除了上面的解决方案,您可以使用 AS 将其设置为一行 .

    CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
    
  • 2

    MySQL方式

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

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

    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

相关问题