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};
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:
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;
MySQL Way
CREATE TABLE recipes_new LIKE production.recipes; INSERT recipes_new SELECT * FROM production.recipes;
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).
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
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.
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
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 ;
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