INSERT INTO… PILIH untuk semua kolom MySQL

119

Saya mencoba memindahkan data lama dari:

this_table >> this_table_archive

menyalin semua kolom. Saya sudah mencoba ini, tetapi tidak berhasil:

INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00');

Catatan: tabelnya identik dan telah idditetapkan sebagai kunci utama.

Kyle
sumber
1
Tentukan "tidak berhasil". Saya mengalami masalah yang mungkin serupa tetapi saya tidak tahu karena Anda tidak mengatakan apa masalah Anda !!
Balapan Ringan di Orbit
Itu tidak rusak, itu tidak berfungsi.
Webmaster G

Jawaban:

218

Sintaks yang benar dijelaskan di manual . Coba ini:

INSERT INTO this_table_archive (col1, col2, ..., coln)
SELECT col1, col2, ..., coln
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00';

Jika kolom id adalah kolom auto-increment dan Anda sudah memiliki beberapa data di kedua tabel, maka dalam beberapa kasus Anda mungkin ingin menghilangkan id dari daftar kolom dan membuat id baru sebagai gantinya untuk menghindari memasukkan id yang sudah ada di aslinya meja. Jika tabel target Anda kosong maka ini tidak akan menjadi masalah.

Mark Byers
sumber
73

Untuk sintaksnya, ini terlihat seperti ini (biarkan daftar kolom secara implisit berarti "semua")

INSERT INTO this_table_archive
SELECT *
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00'

Untuk menghindari kesalahan kunci primer jika Anda sudah memiliki data di tabel arsip

INSERT INTO this_table_archive
SELECT t.*
FROM this_table t
LEFT JOIN this_table_archive a on a.id=t.id
WHERE t.entry_date < '2011-01-01 00:00:00'
  AND a.id is null  # does not yet exist in archive
RichardTheKiwi
sumber
6
+1 untuk gabungan kiri untuk menghindari tabrakan kunci utama.
Hartley Brody
23

Penambahan jawaban Mark Byers:

Kadang-kadang Anda juga ingin memasukkan detail Hardcode yang lain mungkin ada kendala Unik gagal dll. Jadi gunakan berikut ini dalam situasi seperti di mana Anda mengganti beberapa nilai kolom.

INSERT INTO matrimony_domain_details (domain, type, logo_path)
SELECT 'www.example.com', type, logo_path
FROM matrimony_domain_details
WHERE id = 367

Di sini nilai domain ditambahkan oleh saya dengan cara Hardcode untuk menyingkirkan kendala Unik.

Pratik
sumber
4

tidakkah Anda membutuhkan double () untuk nilai bit? jika tidak coba ini (walaupun pasti ada cara yang lebih baik

insert into this_table_archive (id, field_1, field_2, field_3) 
values
((select id from this_table where entry_date < '2001-01-01'), 
((select field_1 from this_table where entry_date < '2001-01-01'), 
((select field_2 from this_table where entry_date < '2001-01-01'), 
((select field_3 from this_table where entry_date < '2001-01-01'));
Daniel Casserly
sumber
2
OP sedang menggunakan INSERT INTO .. SELECT FROM, bukan INSERT INTO .. VALUES. Fitur berbeda.
Balapan Ringan di Orbit
0

Lebih Banyak Contoh & Detail

    INSERT INTO vendors (
     name, 
     phone, 
     addressLine1,
     addressLine2,
     city,
     state,
     postalCode,
     country,
     customer_id
 )
 SELECT 
     name,
     phone,
     addressLine1,
     addressLine2,
     city,
     state ,
     postalCode,
     country,
     customer_id
 FROM 
     customers;
Pengembang
sumber