Wie kann in MySQL der Inhalt einer Tabelle in eine andere Tabelle in derselben Datenbank kopiert werden?


117

Ich bin neu in MySQL. Ich möchte den Inhalt einer Tabelle in eine andere Tabelle innerhalb derselben Datenbank kopieren. Grundsätzlich möchte ich eine Tabelle aus einer anderen Tabelle einfügen. Gibt es eine einfache Möglichkeit, dies zu tun?

Antworten:


184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

BEARBEITEN: oder wenn die Tabellen unterschiedliche Strukturen haben, können Sie auch:

INSERT INTO TARGET_TABLE (`col1`,`col2`) SELECT `col1`,`col2` FROM SOURCE_TABLE;

EDIT: um dies einzuschränken ..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1

Was passiert, wenn jemand während der Ausführung dieser Abfrage Einfügevorgänge in der Quelltabelle ausführen möchte? es sperrt den Einfügevorgang oder nicht?
Lawakush Kurmi

135

Wenn die Tabelle nicht vorhanden ist, können Sie eine Tabelle mit demselben Schema wie folgt erstellen:

CREATE TABLE table2 LIKE table1;

So kopieren Sie die Daten:

INSERT INTO table2 SELECT * FROM table1

1
Ich habe diesen Code SELECT * INTO newTable FROM sourceTablein w3school gefunden , warum er nicht funktioniertMySQL
Kasun Siyambalapitiya

@KasunSiyambalapitiya SELECT ... INTOsoll eine Tabelle in eine Ausgabedatei oder in Variablen exportieren. nicht direkt in einen Tisch. Siehe dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J

@ Kasun Siyambalapitiya diese w3school-Seite ist für ein anderes SQL, nicht für MySQL gedacht. w3schools verfügt jetzt über eine Fehlerberichterstattung. Wenn Sie Probleme finden, melden Sie diese auf ihrer Website, um genaues Wissen zu erhalten.
Nightwolf

27

Wenn table1 groß ist und Sie es nicht für die Dauer des Kopiervorgangs sperren möchten, können Sie stattdessen ein Dump-and-Load durchführen:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;

Ich habe versucht, mit der Lösung stackoverflow.com/a/9536680/351903 auf einem RDS zu sichern . Die Datei wurde erstellt, blieb aber lange Zeit 0. Außerdem konnte show processlistich beim Überprüfen keine laufende Abfrage sehen. Ich bin mir nicht sicher, worum es geht.
Sandeepan Nath

15

Das hat bei mir funktioniert,

CREATE TABLE newtable LIKE oldtable;

Repliziert Newtable mit alter Tabelle

INSERT newtable SELECT * FROM oldtable;;

Kopiert alle Zeilendaten in eine neue Tabelle.

Danke dir


10

Wenn Sie den Inhalt in einer einzigen Aufnahme erstellen und kopieren möchten, verwenden Sie einfach SELECT:

CREATE TABLE new_tbl SELECT * FROM orig_tbl;


4
+1 - obwohl die neue Tabelle nicht die Indexdefinitionen der ersten enthält. Der Ansatz "create ... like ..." kopiert auch Indexdefinitionen.
Martin

2

Das hat bei mir funktioniert. Sie können die SELECT-Anweisung mit den WHERE- und LIMIT-Klauseln komplexer gestalten.

Duplizieren Sie zuerst Ihre große Tabelle (ohne die Daten), führen Sie die folgende Abfrage aus und schneiden Sie dann die größere Tabelle ab.

INSERT INTO table_small (SELECT * FROM table_large WHERE column = 'value' LIMIT 100)

Super einfach. :-)


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.