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、主キーとして設定されています。

4

5 に答える 5

219

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

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を生成したい場合があります。テーブル。ターゲットテーブルが空の場合、これは問題になりません。

于 2011-03-09T22:56:42.660 に答える
77

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

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
于 2011-03-09T22:57:48.900 に答える
23

マークバイアーズへの追加回答:

ハードコードされた詳細を挿入したい場合もあります。そうでない場合は、一意性制約が失敗するなどの可能性があります。したがって、列の一部の値をオーバーライドするような状況では、次を使用してください。

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

ここで、ドメイン値は、一意性制約を取り除くためにハードコードされた方法で私によって追加されます。

于 2015-12-07T10:40:24.823 に答える
4

値ビットにdouble()は必要ありませんか?これを試さない場合(より良い方法があるはずですが)

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'));
于 2011-03-09T22:59:25.827 に答える
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;
于 2019-06-18T14:04:30.693 に答える