workbench Duplicando uma tabela, índices e dados do MySQL




unique index mysql workbench (7)

Vá para phpMyAdmin e selecione sua tabela original e selecione a aba " Operações " na área " Copiar tabela para (database.table) ", selecione o banco de dados onde deseja copiar e adicione um nome para sua nova tabela.

Como faço para copiar ou clonar ou duplicar os dados, estrutura e índices de uma tabela MySQL para um novo?

Isso é o que eu encontrei até agora.

Isto irá copiar os dados e a estrutura, mas não os índices:

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

Isso copiará a estrutura e os índices, mas não os dados:

create table {new_table} like {old_table};

MySQL Way

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

Para o MySQL

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

Para MSSQL Use MyDatabase :

Select * into newCustomersTable  from oldCustomersTable;

Este SQL é usado para copiar tabelas, aqui o conteúdo de oldCustomersTable será copiado para newCustomersTable .
Certifique-se de que o newCustomersTable não exista no banco de dados.


Eu encontrei a mesma situação e a abordagem que tomei foi a seguinte: 1. Execute SHOW CREATE TABLE: Isto lhe dará a sintaxe Create Table para a tabela que você deseja clonar 2. Execute a consulta CREATE TABLE alterando o nome da tabela para clonar a mesa.

Isso criará uma réplica exata da tabela que você deseja clonar junto com os índices. A única coisa que você precisa é renomear os índices (se necessário).


Para copiar com índices e gatilhos, faça estas duas consultas:

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

Para copiar apenas estrutura e dados use este:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

Eu já pedi isso antes:

Copie uma tabela MySQL incluindo índices


Expandindo esta resposta, pode-se usar um procedimento armazenado:

CALL duplicate_table('tableName');

Que resultará em uma tabela duplicada chamada tableName_20181022235959 Se chamado quando

SELECT NOW();

resultados:

2018-10-22 23:59:59

Implementação

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 ;

Além da solução acima, você pode usar o AS para torná-lo em uma linha.

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;






mysql