In MySQL, come copiare il contenuto di una tabella in un'altra tabella all'interno dello stesso database?


118

Sono nuovo in MySQL. Vorrei copiare il contenuto di una tabella in un'altra tabella all'interno dello stesso database. Fondamentalmente, vorrei inserire in una tabella da un'altra tabella. C'è un modo semplice per farlo?

Risposte:


184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

EDIT: oppure se le tabelle hanno strutture differenti puoi anche:

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

EDIT: per vincolare questo ..

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

Cosa succederà se qualcuno desidera eseguire operazioni di inserimento nella tabella di origine durante l'esecuzione di questa query? blocca l'operazione di inserimento o no?
Lawakush Kurmi

135

Se la tabella non esiste, puoi crearne una con lo stesso schema in questo modo:

CREATE TABLE table2 LIKE table1;

Quindi, per copiare i dati su:

INSERT INTO table2 SELECT * FROM table1

1
Ho trovato questo codice SELECT * INTO newTable FROM sourceTablein w3school , perché non funziona inMySQL
Kasun Siyambalapitiya

@KasunSiyambalapitiya ha lo SELECT ... INTOscopo di esportare una tabella in un file di output o in variabili; non direttamente in una tabella. Vedi dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J

@Kasun Siyambalapitiya quella pagina di w3school è per un SQL diverso, non inteso per MySQL. w3schools ora ha la segnalazione degli errori, se trovi problemi segnalalo sul loro sito per aiutare con una conoscenza accurata.
Nightwolf,

27

Se table1 è grande e non vuoi bloccarlo per la durata del processo di copia, puoi invece eseguire un dump-and-load:

CREATE TABLE table2 LIKE table1;

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

Ho provato a scaricare su un RDS, utilizzando la soluzione stackoverflow.com/a/9536680/351903 . Il file è stato creato ma è rimasto a dimensione 0 per molto tempo. Inoltre, controllando show processlist, non sono riuscito a vedere alcuna query in esecuzione. Non sono sicuro di quale sia il problema.
Sandeepan Nath,

15

Questo ha funzionato per me

CREATE TABLE newtable LIKE oldtable;

Replica newtable con la vecchia tabella

INSERT newtable SELECT * FROM oldtable;

Copia tutti i dati della riga nella nuova tabella.

Grazie


10

Se vuoi creare e copiare il contenuto in una sola ripresa, usa semplicemente SELEZIONA:

CREA TABELLA new_tbl SELEZIONA * DA orig_tbl;


4
+1 - anche se la nuova tabella non avrà le definizioni di indice dalla prima. L'approccio "crea ... like ..." copierà anche le definizioni degli indici.
Martin,

2

Questo ha funzionato per me. È possibile rendere l'istruzione SELECT più complessa, con le clausole WHERE e LIMIT.

Prima duplica la tabella di grandi dimensioni (senza i dati), esegui la query seguente e quindi tronca la tabella più grande.

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

Super semplice. :-)


0
CREATE TABLE target_table SELECT * FROM source_table;

Crea semplicemente una nuova tabella con la stessa struttura della tabella di origine e copia anche tutte le righe da source_table a target_table.

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

Se avete bisogno di alcune righe da copiare in target_table, quindi applicare una condizione interna in cui la clausola


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.