Di MySQL, bagaimana cara menyalin konten dari satu tabel ke tabel lain dalam database yang sama?

118

Saya baru mengenal MySQL. Saya ingin menyalin konten dari satu tabel ke tabel lain dalam database yang sama. Pada dasarnya, saya ingin menyisipkan ke tabel dari tabel lain. Apakah ada cara mudah untuk melakukan ini?

Joneph O.
sumber

Jawaban:

184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

EDIT: atau jika tabel memiliki struktur yang berbeda, Anda juga dapat:

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

EDIT: untuk membatasi ini ..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1
ggiroux.dll
sumber
Apa yang akan terjadi jika seseorang ingin melakukan operasi penyisipan di tabel sumber selama menjalankan kueri ini? itu mengunci operasi insert atau tidak?
Lawakush Kurmi
135

Jika tabel tidak ada, Anda dapat membuatnya dengan skema yang sama seperti:

CREATE TABLE table2 LIKE table1;

Kemudian, untuk menyalin data ke:

INSERT INTO table2 SELECT * FROM table1
GSto
sumber
1
Saya menemukan kode ini SELECT * INTO newTable FROM sourceTabledi w3school , mengapa tidak berfungsiMySQL
Kasun Siyambalapitiya
@KasunSiyambalapitiya SELECT ... INTOdimaksudkan untuk mengekspor tabel ke file output, atau ke variabel; tidak langsung ke meja. Lihat dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J
@Kasun Siyambalapitiya bahwa halaman w3sekolah adalah untuk SQL yang berbeda, bukan untuk MySQL. w3schools sekarang memiliki pelaporan kesalahan, jika Anda menemukan masalah laporkan di situs mereka untuk membantu dengan pengetahuan yang akurat.
Nightwolf
27

Jika tabel1 besar dan Anda tidak ingin menguncinya selama proses penyalinan, Anda dapat melakukan dump-and-load sebagai gantinya:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;
Ike Walker
sumber
Saya mencoba membuang di RDS, menggunakan solusi stackoverflow.com/a/9536680/351903 . File dibuat tetapi ukurannya tetap 0 untuk waktu yang lama. Selain itu, saat memeriksa show processlist, saya tidak dapat melihat kueri apa pun yang sedang berjalan. Tidak yakin apa masalahnya.
Sandeepan Nath
15

Ini berhasil untuk saya,

CREATE TABLE newtable LIKE oldtable;

Mereplikasi tabel baru dengan tabel lama

INSERT newtable SELECT * FROM oldtable;

Salin semua data baris ke tabel baru.

Terima kasih

Jason
sumber
10

Jika Anda ingin membuat dan menyalin konten dalam satu pengambilan, cukup gunakan SELECT:

BUAT TABEL new_tbl SELECT * FROM orig_tbl;

Frank Heikens
sumber
4
+1 - meskipun tabel baru tidak memiliki definisi indeks dari yang pertama. Pendekatan "buat ... seperti ..." akan menyalin definisi indeks juga.
Martin
2

Ini berhasil untuk saya. Anda dapat membuat pernyataan SELECT lebih kompleks, dengan klausa WHERE dan LIMIT.

Pertama, duplikat tabel besar Anda (tanpa data), jalankan kueri berikut, lalu potong tabel yang lebih besar.

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

Sangat sederhana. :-)

Sandor Fekete
sumber
0
CREATE TABLE target_table SELECT * FROM source_table;

Ini hanya membuat tabel baru dengan struktur yang sama seperti tabel sumber dan juga menyalin semua baris dari source_table ke target_table.

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

Jika Anda membutuhkan beberapa baris untuk disalin ke target_table, maka terapkan kondisi di dalam klausa where

CelinVeronicca
sumber
-3

Coba ini. Bekerja dengan baik di Oracle 10g saya,

CREATE TABLE new_table
  AS (SELECT * FROM old_table);
RAHUL KUMAR
sumber
8
Tapi pertanyaannya adalah tentang MySQL.
Salman A
Ini memberi + untuk ini, karena bekerja dengan MySQL juga. dev.mysql.com/doc/refman/5.7/en/create-table-select.html
Daniel