INSERT INTO… Tüm MySQL sütunları için SELECT


119

Eski verileri şuradan taşımaya çalışıyorum:

this_table >> this_table_archive

tüm sütunları kopyalamak. Bunu denedim ama işe yaramıyor:

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

Not: tablolar aynıdır ve idbirincil anahtar olarak ayarlanmıştır.


1
"Çalışmıyor" u tanımlayın. Ben de benzer bir sorun yaşıyorum ama söyleyemiyorum çünkü sorunun ne olduğunu söylemedin !!
Orbit'te Hafiflik Yarışları

Kırık değil, işe yaramıyor.
Webmaster G

Yanıtlar:


218

Doğru sözdizimi kılavuzda açıklanmıştır . Bunu dene:

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

Kimlik sütunları otomatik artış sütunu ise ve her iki tabloda da zaten bazı verileriniz varsa, bazı durumlarda, orijinalde zaten var olan bir kimliği eklemekten kaçınmak için kimliği sütun listesinden çıkarabilir ve bunun yerine yeni kimlikler oluşturabilirsiniz. tablo. Hedef tablonuz boşsa, bu bir sorun olmayacaktır.


73

Sözdizimi için şöyle görünür (örtük olarak "tümü" anlamına gelmek için sütun listesini dışarıda bırakın)

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

Arşiv tablosunda zaten verileriniz varsa birincil anahtar hatalarından kaçınmak için

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

6
Birincil anahtar çakışmalarını önlemek için sol birleşim için +1.
Hartley Brody

23

Mark Byers cevabına ek olarak:

Bazen, Sabit kodlu ayrıntıları da eklemek isteyebilirsiniz, aksi takdirde Benzersiz kısıtlama başarısız olabilir, vb. Bu nedenle, sütunların bazı değerlerini geçersiz kıldığınız durumlarda aşağıdakileri kullanın.

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

Burada alan değeri, Benzersiz kısıtlamadan kurtulmak için benim tarafımdan Sabit kodlanmış şekilde eklenir.


4

değerler biti için double () 'a ihtiyacınız yok mu? Bunu denemediyseniz (daha iyi bir yolu olsa da

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'));

2
OP kullanıyor INSERT INTO .. SELECT FROM, değil INSERT INTO .. VALUES. Farklı özellik.
Orbit'te Hafiflik Yarışları

0

Daha Fazla Örnek ve Ayrıntı

    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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.