Duplicating a MySQL table, indices, and data

前端 未结 12 1191
天涯浪人
天涯浪人 2020-11-27 08:42

How do I copy or clone or duplicate the data, structure, and indices of a MySQL table to a new one?

This is what I\'ve found so far.

This will copy the data

相关标签:
12条回答
  • 2020-11-27 09:19

    To create table structure only use this below code :

    CREATE TABLE new_table LIKE current_table; 
    

    To copy data from table to another use this below code :

    INSERT INTO new_table SELECT * FROM current_table;
    
    0 讨论(0)
  • 2020-11-27 09:27

    FOR MySQL

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

    FOR MSSQL Use MyDatabase:

    Select * into newCustomersTable  from oldCustomersTable;
    

    This SQL is used for copying tables, here the contents of oldCustomersTable will be copied to newCustomersTable.
    Make sure the newCustomersTable does not exist in the database.

    0 讨论(0)
  • 2020-11-27 09:30

    To duplicate a table and its structure without data from a different a database use this. On the new database sql type

    CREATE TABLE currentdatabase.tablename LIKE olddatabase.tablename

    0 讨论(0)
  • 2020-11-27 09:32

    After I tried the solution above, I come up with my own way.

    My solution a little manual and needs DBMS.

    First, export the data.

    Second, open the export data.

    Third, replace old table name with new table name.

    Fourth, change all the trigger name in the data (I use MySQL and it show error when I don't change trigger name).

    Fifth, import your edited SQL data to the database.

    0 讨论(0)
  • 2020-11-27 09:35

    The better way to duplicate a table is using only DDL statement. In this way, independently from the number of records in the table, you can perform the duplication instantly.

    My purpose is:

    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;
    

    This avoids the INSERT AS SELECT statement that, in case of table with a lot of records can take time to be executed.

    I suggest also to create a PLSQL procedure as the following example:

    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 ;
    

    Have a nice day! Alex

    0 讨论(0)
  • 2020-11-27 09:36

    Expanding on this answer one could use a stored procedure:

    CALL duplicate_table('tableName');
    

    Which will result in a duplicate table called tableName_20181022235959 If called when

    SELECT NOW();
    

    results:

    2018-10-22 23:59:59
    

    Implementation

    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 ;
    
    0 讨论(0)
提交回复
热议问题