Der schnellste Weg, um eine Tabelle in MySQL zu kopieren?


82

Ich möchte eine Tabelle in MySQL kopieren. Was ist der schnellste Weg? So was?

CREATE TABLE copy LIKE original;
INSERT INTO copy SELECT * FROM original;

oder

CREATE TABLE copy SELECT * FROM original;
ALTER TABLE copy ADD PRIMARY KEY (id);

oder gibt es einen anderen weg

EDIT: Ich mache mir Sorgen, dass die Indizes neu erstellt werden. Wie geht MySQL vor, um diese Anweisungen auszuführen?

PS. kann keine Kommandozeilen-Tools wie mysqldump verwenden, muss on-the-fly sein.

Antworten:


50

Dadurch wird die Struktur der Tabelle sofort kopiert, nicht jedoch die Daten:

CREATE TABLE copy LIKE original;

Dadurch werden alle Indizes erstellt, über die die originalTabelle verfügt.

In MySQL funktioniert das so 5.1.39.


3
Trigger werden jedoch nicht kopiert.
ursitesion

3
Beachten Sie, dass dadurch auch keine Fremdschlüsseleinschränkungen kopiert werden.
Omer Sabic

46

Der schnellste Weg, MyISAM- Tabellen unter Beibehaltung von Indizes und möglicherweise anderen Speicher-Engines zu verwenden, ist:

CREATE TABLE copy LIKE original;
ALTER TABLE copy DISABLE KEYS;
INSERT INTO copy SELECT * FROM original;
ALTER TABLE copy ENABLE KEYS;

Sie möchten Ihre Schlüssel für das Laden der Datenbank deaktivieren und die Schlüssel am Ende neu erstellen.

Ebenso für InnoDB :

SET unique_checks=0; SET foreign_key_checks=0; 
..insert sql code here..
SET unique_checks=1; SET foreign_key_checks=1;

(Wie in den Kommentaren erwähnt.)


1
Seltsam. Das Einfügen mit Schlüsseln dauerte 36 Minuten, und diese Methode dauerte 10 + 26 Minuten (Einfügen + Ändern). 6 Indizes, 28 M Datensätze, Win 7 x 64, 8 GB RAM.
Per Lindberg

Ein ENABLE KEYS verursacht eine "Reparaturtabelle". Überprüfen Sie in Ihrer Prozessliste, auf welche Weise dies geschieht. Es gibt zwei Arten von: 1. Reparaturtabelle mit Schlüsselcache 2. Reparaturtabelle durch Sortieren Die zweite Tabelle ist schnell und wird nur verwendet, wenn myisam_max_sort_file_size groß genug ist. dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
lopo

ALTER TABLE table DISABLE/ENABLE KEYSfunktioniert nicht in InnoDB und gibt unten Warnung Table storage engine for 'table' doesn't have this option.
Amil Waduwawara

1
Für Innodb verwenden SET unique_checks=0; SET foreign_key_checks=0;Sie hier SQL-Code einfügenSET unique_checks=1; SET foreign_key_checks=1;
Tuku

13

Aus dem Handbuch :

"CREATE TABLE ... SELECT erstellt nicht automatisch Indizes für Sie. Dies geschieht absichtlich, um die Anweisung so flexibel wie möglich zu gestalten. Wenn Sie Indizes in der erstellten Tabelle haben möchten, sollten Sie diese vor der SELECT-Anweisung angeben:"

CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

Sie können Indizes und Datentypen (um eine Datentypkonvertierung zu vermeiden) mit CREATE TABLE LIKEund angeben CREATE TABLE SELECT. Welches schneller ist, hängt von Ihrem Setup ab.


9

Führen Sie diese beiden Abfragen aus, um mit Indizes und Triggern zu kopieren:

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;

Sollte nicht INSERT INTOstatt sein INSERT?
Giordano

6

Funktioniert create table mynewtable (select * from myoldtable)in MySQL? Wenn ja, können Sie es auch versuchen.


5

Der beste Weg, um die Struktur und alle Einträge von einer Tabelle in eine andere Tabelle zu kopieren (indem Sie eine neue Tabelle erstellen), ist diese Abfrage ...

CREATE TABLE new_table LIKE old_table; INSERT new_table SELECT * FROM old_table;


3

Versuchen Sie es SELECT INTOund verwenden Sie eine Variable als Vermittler.

Sie müssen zuerst die empfangende Tabelle erstellen, um dieselbe Struktur wie die Quelltabelle zu haben.

Das Beste ist, es ist intern, also schnell. Sie verlieren jedoch Ihre Indizes.


Select into wird von mySQL nicht unterstützt
Draco Ater

@Draco Ater - Ja, das tut es. Es werden nur Variablen verwendet.
Amphetamachine

2
Können Sie ein Beispiel geben? Ich denke, dass die Variablen nur den letzten Wert enthalten, der von der Auswahl gelesen wurde, aber nicht alle Werte in der Tabelle. Solange Sie keinen Cursor verwenden und keine Tabellen mit mehr als einer Zeile kopieren möchten, funktioniert diese Lösung überhaupt nicht.
FancyPants

2

Wenn Sie MyISAM verwenden, können Sie auch die einzelnen Dateien kopieren und umbenennen. .MYD-, .MYI-, .FRM-Dateien im Backend


1

Vielleicht könnten Sie einen Blick darauf werfen SHOW CREATE TABLE.

Schritte zu unternehmen:

  • Gehe zu phpmyadmin

  • Gehen Sie zu SQL

Führen Sie diese Abfrage aus

SHOW CREATE TABLE `the_old_table`;
  • Klicken Sie auf Optionen. Überprüfen Sie "Volltexte" und drücken Sie Los.

Das Ergebnis ist eine vollständige CREATE TABLE-Anweisung. Bearbeiten Sie die Abfrage, bis Sie zufrieden sind.

Ressource: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html


0
CREATE TABLE copy SELECT * FROM original;

Ist ein schneller Weg, aber vielleicht nicht die schnellste Ursache für Indizes.


Bitte bearbeiten Sie Ihre Antwort und formatieren Sie sie richtig, damit sie lesbar ist.
Neeku

1
Diese Anweisung kopiert weder Indizes noch Trigger, die dieser Tabelle zugeordnet sind.
ursitesion
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.