2016-07-21 8 views
0

私はこのコードをcsvファイルから挿入します。行がデータベースにすでに存在する場合、一部の値が更新されます。私はそれがほしいと思う方法。結果がCSVファイルにないときにテーブルから行を削除

INSERT INTO test_table (`id`,`order_id`,`quantity`,`price`,`order_date`,`shipping_date`) 
        VALUES ('$orderId', '$quantity', '$price', '$orderDate', '$shippingDate') 
        ON DUPLICATE KEY UPDATE `order_date` = '$orderDate', `shipping_date` = '$shippingDate'" 

ただし、行がcsvにないときは、データベースから削除する必要があります。たとえば :

csvファイル:

order_id quantity price order_date shipping_date 
1   10  1.00 2016-10-5 2016-10-6 

私はcsvファイルからスクリプトと結果がデータベースに追加されて実行します。しかし次のCSVには次の内容が含まれています:

order_id quantity price order_date shipping_date 
2   120  2.00 2016-10-8 2016-10-10 

新しい行を追加する必要があります。問題は無く、私の質問は大丈夫です。しかし、order_id 1の行はcsvでなくなっています。その行はデータベースから削除する必要があります。これどうやってするの?これは私のクエリで可能ですか?それとも別のものが必要ですか?

+0

csvが変更されたときにcsvで削除されたものを削除するようにトリガーを追加しようとしましたか?あなたは定期的に任意の言語を使用してそれを行うことができますし、csvをハッシュし、最後のハッシュと比較します。違いについては別のスキャンの場合 – FMashiro

+0

いいえ、私は最善のアプローチが何であるか分かりません。私はcsvをループして、csvではなくdbに行があるかどうかを調べることができます。しかし、それはスマートです、それを行うより良い方法がありますか? – da1lbi3

答えて

1

アップデートの「バージョン」を格納するフィールドを追加する必要があります。

ALTER TABLE test_table ADD version BIGINT DEFAULT 0; 

INSERTを行う前に、PHPで$ vers = time()を割り当ててください。 古い行には現在のバージョン番号より小さいバージョン値が含まれます。

クエリのINSERTとON DUPLICATE部分の両方で、versionフィールドを更新するようにSQLを変更します。

INSERT INTO test_table (`id`,`order_id`,`quantity`,`price`,`order_date`,`shipping_date`,`version`) 
        VALUES ('$orderId', '$quantity', '$price', '$orderDate', '$shippingDate','$vers') 
        ON DUPLICATE KEY UPDATE `order_date` = '$orderDate', `shipping_date` = '$shippingDate', `version` = $vers" 

インポートします。インポートが完了した後

その後、

DELETE FROM test_table WHERE version < $vers 

古いデータを削除することはトリックを行う必要があります。

+0

それは本当にスマートです!ありがとうございました! – da1lbi3

+0

@ da1lbi3よろしくお願いします! – olegsv

関連する問題