古いデータを次から移動しようとしています:
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
が主キーとして設定されています。
正しい構文は manual で説明されています。これを試して:
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を生成することができます表。ターゲットテーブルが空の場合、これは問題になりません。
構文については、次のようになります(暗黙的に「すべて」を意味するように列リストを省略します)
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
Mark Byersの回答に追加:
Hardcoded detailsを挿入したい場合もあります。それ以外の場合は、Unique制約が失敗する場合があります。そのため、列の値をオーバーライドするような状況では、以下を使用します。
INSERT INTO matrimony_domain_details (domain, type, logo_path)
SELECT 'www.example.com', type, logo_path
FROM matrimony_domain_details
WHERE id = 367
ここでdomain valueがハードコード化された方法で私によって追加され、Unique制約を取り除きます。
値ビットに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'));
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;