すべてのMySQL列に対してINSERT INTO…SELECT


119

古いデータを次の場所から移動しようとしています:

this_table >> this_table_archive

すべての列をコピーします。私はこれを試しましたが、うまくいきません:

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

注:テーブルは同一でありid、主キーとして設定されています。


1
「動かない」と定義する。同様の問題が発生している可能性がありますが、問題が何であるかを言わなかったため、わかりません。
オービットでの軽さのレース

それは壊れていません、それは機能しません。
ウェブマスターG

回答:


218

正しい構文はマニュアルに記載されています。これを試して:

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

id列が自動インクリメント列であり、両方のテーブルにすでにいくつかのデータがある場合、場合によっては、列リストからidを省略し、代わりに新しいidを生成して、元のIDにすでに存在するidを挿入しないようにすることができます。テーブル。ターゲットテーブルが空の場合、これは問題になりません。


73

構文は次のようになります(列リストを省略して暗黙的に「すべて」を意味します)

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

アーカイブテーブルに既にデータがある場合に主キーエラーを回避するため

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
主キーの衝突を回避するための左結合の+1。
Hartley Brody

23

Mark Byersの回答への追加:

ハードコードされた詳細を挿入したい場合もあるでしょう。それ以外の場合は、Unique制約の失敗などがある可能性があります。そのため、列の一部の値を上書きするような状況では、以下を使用してください。

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

ここでドメイン値は、Unique制約を取り除くためにハードコードされた方法で私が追加しました。


4

値ビットにダブル()は必要ありませんか?そうでない場合はこれを試してください(より良い方法があるはずですが

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はを使用してINSERT INTO .. SELECT FROMおり、は使用していませんINSERT INTO .. VALUES。別の機能。
オービットでの軽さのレース

0

その他の例と詳細

    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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.