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?

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

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

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;

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


10

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

BUAT TABEL new_tbl SELECT * FROM orig_tbl;


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. :-)


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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.