Duplicating a MySQL table, indices, and data

前端 未结 12 1245
天涯浪人
天涯浪人 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: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 ;
    

提交回复
热议问题