web-dev-qa-db-fra.com

Dupliquer une table MySQL, des index et des données

Comment copier, copier ou dupliquer les données, la structure, Et les index d'une table MySQL sur une nouvelle

C'est ce que j'ai trouvé jusqu'à présent.

Cela copiera les données et la structure, Mais pas les index:

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

Cela copiera la structure et les index, Mais pas les données:

create table {new_table} like {old_table};
562
xkcd150

Pour copier avec des index et des déclencheurs, effectuez ces 2 requêtes:

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

Pour copier uniquement la structure et les données, utilisez celui-ci:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

J'ai déjà demandé ceci:

Copier une table MySQL avec index

1273
Haim Evgi

Outre la solution ci-dessus, vous pouvez utiliser AS pour le faire en une seule ligne.

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
44
theDistantStar

Allez dans phpMyAdmin et sélectionnez votre table d'origine, puis sélectionnez l'onglet "Operations" dans la zone "Copier le tableau dans (database.table)", sélectionnez la base de données où vous souhaitez copier et ajoutez nom pour votre nouvelle table.

 copy table - phyMyAdmin Screenshot

9
spuvi86

MySQL Way

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

J'ai trouvé la même situation et l'approche que j'ai adoptée était la suivante: 1. Exécutez SHOW CREATE TABLE: Ceci vous donnera la syntaxe Create Table pour la table que vous voulez cloner 2. Exécutez la requête CREATE TABLE en modifiant le nom de la table pour la cloner.

Cela créera une réplique exacte de la table que vous voulez cloner avec Index. La seule chose dont vous avez besoin ensuite est de renommer les index (si nécessaire).

2
Jai

La meilleure façon de dupliquer une table consiste à utiliser uniquement une instruction DDL. De cette manière, indépendamment du nombre d’enregistrements de la table, vous pouvez effectuer la duplication instantanément. Mon but est:

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;

cela évite l’instruction INSERT AS SELECT qui, dans le cas d’une table avec beaucoup d’enregistrements, peut prendre du temps à être exécutée.

Je suggère également de créer une procédure PLSQL comme exemple suivant:

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 ;

bonne journée! Alex

1
Alessandro

Après essayé la solution ci-dessus. Je viens avec ma propre voie.

Ma solution un peu manuellement et besoin de SGBD.

Exportez d'abord les données.

deuxième ouvrir les données d'exportation.

troisième remplace l'ancien nom de la table par le nouveau nom de la table.

quatrième changement de tout le nom du déclencheur dans les données (j'utilise mysql et il affiche une erreur lorsque je ne change pas le nom du déclencheur)

cinquième importer vos données SQL éditées à la base de données. 

1
Võ Minh

En développant cette réponse on pourrait utiliser une procédure stockée:

CALL duplicate_table('tableName');

Ce qui donnera une table en double appelée tableName_20181022235959 Si appelé quand

SELECT NOW();

résultats:

2018-10-22 23:59:59

La mise en oeuvre

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
Nae

Essaye ça

`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;`

je sélectionne 4 colonnes de old-table et crée un nouveau tableau

0
Crazy_DT0