質問

たとえば、としましょう:

  • 私は2つのテーブルを持っています: old_datanew_data.

  • 両方 old_datanew_data と呼ばれる1つの列を持っている この_is_col.

  • 両方 old_datanew_data さまざまな(数百)行の日付(2010-02-06、2010-01-09、2007-06-02など)があります。).両方のテーブルには必ずしも同じ日付があるわけではありませんが、両方とも同じ形式を持っています。

  • 両方のテーブルのフィールドはさまざまな整数です。


私の仕事:

  • からフィールドをコピーします old_datanew_data.

  • 両方のテーブルに日付が存在する場合、フィールドは次のようになります。 new_data 交換されます。

  • 日付が存在しない場合 new_data, その後、正しい行が追加され、フィールドがコピーされます。


これが私がどこまで得たかです:

一時的な列を作成する:

ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;

からデータをコピーする old_data:

INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;

一時的な列を結合し、 new_data . この_is_col.(私はこれまでに得ていないので、このステップを実際には理解していません)。

MERGE? `tempColumn` `this_is_col`;

一時テーブルの削除

ALTER TABLE `new_data` DROP `tempColumn`;

2番目のアクション(データを一時的な列に転送する)を実行すると、このエラーが発生します:

#1062 - Duplicate entry '0000-00-00' for key 1

そして今、私は立ち往生しています。任意の助けがいただければ幸いです。MySQLとphpMyAdminを使用してSQLコマンドをテストしています。

役に立ちましたか?

解決

日付が一意のキーとして索引付けされていると仮定します:

INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...

他のヒント

あなたが欲しい 挿入します。..重複キーの更新時.あなたの解決策はすでにあなたのタスクのステップ1と3を満たしています、重複キーの更新でステップ2の世話をします。

更新するのではなく、最初に行を削除する場合は、次のようにします: 置換

それはあまりにも一つの行になるだろうので、:REPLACE data SELECTを使用すると、テキスト列を追加して奇妙なことをする必要はありません。

どのようにちょうどやってはどうですか UPDATEINSERT?

UPDATE new_data SET col=col 
FROM new_data a join old_data b on a.this_is_col = b.this_is_col

その後、

INSERT INTO new_data (cols) SELECT cols 
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)

私が誤解しない限り。..

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top