webentwicklung-frage-antwort-db.com.de

Duplizieren einer MySQL-Tabelle, -Indizes und -Daten

Wie kopiere oder dupliziere oder dupliziere ich Daten, Struktur, Und Indizes einer MySQL-Tabelle in eine neue Tabelle?

Das habe ich bisher gefunden.

Dadurch werden die Daten und die Struktur kopiert, jedoch nicht die Indizes:

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

Dadurch werden die Struktur und die Indizes kopiert, jedoch nicht die Daten:

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

Um mit Indizes und Triggern zu kopieren, führen Sie diese beiden Abfragen aus:

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

Um nur Struktur und Daten zu kopieren, verwenden Sie diese:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

Ich habe das schon einmal gefragt:

Eine MySQL-Tabelle inklusive Indizes kopieren

1273
Haim Evgi

Abgesehen von der obigen Lösung können Sie AS verwenden, um sie in einer Zeile zu erstellen.

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
44
theDistantStar

Gehen Sie zu phpMyAdmin und wählen Sie Ihre ursprüngliche Tabelle aus. Wählen Sie dann die Registerkarte "Operations" im Bereich "Copy table to (database.table)" Name für Ihre neue Tabelle.

 copy table - phyMyAdmin Screenshot

9
spuvi86

MySQL-Weg

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

Ich fand die gleiche Situation und die Herangehensweise war wie folgt: 1. SHOW CREATE TABLE ausführen: Damit erhalten Sie die Syntax "Tabelle erstellen" für die Tabelle, die Sie klonen möchten. 2. Führen Sie die CREATE TABLE-Abfrage aus, indem Sie den Tabellennamen so ändern, dass die Tabelle geklont wird.

Dadurch wird eine exakte Replik der Tabelle erstellt, die Sie zusammen mit den Indizes klonen möchten. Sie müssen dann lediglich die Indizes umbenennen (falls erforderlich).

2
Jai

Die bessere Möglichkeit, eine Tabelle zu duplizieren, besteht darin, nur die DDL-Anweisung zu verwenden. Auf diese Weise können Sie unabhängig von der Anzahl der Datensätze in der Tabelle die Duplizierung sofort ausführen. Mein Ziel ist:

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;

vermeiden Sie die Anweisung INSERT AS SELECT, die bei Tabellen mit vielen Datensätzen einige Zeit in Anspruch nehmen kann, um ausgeführt zu werden.

Ich schlage auch vor, eine PLSQL-Prozedur wie im folgenden Beispiel zu erstellen:

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 ;

einen schönen Tag noch! Alex

1
Alessandro

Nachdem versucht die Lösung oben. Ich finde meinen eigenen Weg.

Meine Lösung ein wenig manuell und brauche DBMS.

Exportieren Sie zuerst die Daten.

2. Öffnen Sie die Exportdaten.

3. Ersetzen Sie den alten Tabellennamen durch den neuen Tabellennamen.

vierte Änderung aller Auslösernamen in den Daten (ich verwende mysql und es wird ein Fehler angezeigt, wenn ich den Auslösernamen nicht ändere)

fünftens importieren Sie Ihre bearbeiteten SQL-Daten in die Datenbank. 

1
Võ Minh

Erweitern auf diese Antwort könnte eine gespeicherte Prozedur verwendet werden:

CALL duplicate_table('tableName');

Dies führt zu einer doppelten Tabelle mit dem Namen tableName_20181022235959 Wenn aufgerufen, wenn

SELECT NOW();

ergebnisse:

2018-10-22 23:59:59

Implementierung

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

Versuche dies

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

ich wähle 4 Spalten aus der alten Tabelle und mache eine neue Tabelle

0
Crazy_DT0