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.

Anon
quelle

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.

ceteras
quelle
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.)

ctbrown
quelle
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.

dnagirl
quelle
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;
Zigri2612
quelle
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.

Draco Ater
quelle
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;

Anil Chahal
quelle
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.

Amphetamachine
quelle
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

Aravind
quelle
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

julianisch
quelle
0
CREATE TABLE copy SELECT * FROM original;

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

Thor
quelle
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