0

2 つの MySQL テーブルがあります。最初のテーブルには、5 分ごとに更新される cron ジョブが実行されています。cron ジョブが実行されると、すべてのデータが最初のテーブルから 2 番目のテーブル (アーカイブ テーブル) に移動され、最初のテーブルが切り捨てられ、特定の URL で常に更新されている CSV ファイルから情報が更新されます。あるテーブルから次のテーブルに構造をコピーしてテーブルを作成しました (したがって、それらは構造が同一です)。

私が実行しているコードは次のとおりです。

$sql = "
INSERT INTO table2 (id, time, size, location, county, state, lat, lon, comments)
SELECT id, time, size, location, county, state, lat, lon, comments FROM table1";
$result = $mysqli->query($sql);

問題は、cron ジョブが頻繁に実行されるため、常に完全に更新されるとは限らないため、table2 に重複したエントリが作成されることです。使用しようとしていたコードは次のとおりですが、機能していないようです。

$sql = "
INSERT INTO table2 (id, time, size, location, county, state, lat, lon, comments)
SELECT id, time, size, location, county, state, lat, lon, comments FROM table1
ON DUPLICATE KEY UPDATE id=id
";
$result = $mysqli->query($sql);

両方のテーブルのキーが同じ (id) であることを確認しました。

これらの操作は一緒に機能しませんか、それとも私の構文がどこかで間違っていますか? テーブルを更新してから別の操作を実行して後で重複を取り除くのではなく、これらの操作をすべて一度に実行したかったのです。

ご協力いただきありがとうございます!

4

1 に答える 1

0

データの重複を避けるために、挿入無視クエリを使用できます。ただし、最大エントリを選択するたびに。table1 から新しいエントリが切り捨てられる可能性がある場合があります

$sql = "
INSERT IGNORE INTO table2 (id, time, size, location, county, state, lat, lon, comments)
SELECT id, time, size, location, county, state, lat, lon, comments FROM table1";

このアプローチに従うことができます $primary_id = last_updated_primary_key;

//add where condition int the where query
$sql = "
INSERT INTO table2 (id, time, size, location, county, state, lat, lon, comments)
SELECT id, time, size, location, county, state, lat, lon, comments FROM table1 WHERE id> < last_updated_primary_key >";

既存の主キーを使用して古いエントリを削除します

DELETE FROM table1 WHERE id < last_updated_primary_key;

最新の主キーを上書きする

$primary_id = last_updated_new_primary_key;

トリガーを使用して、新しいエントリをあるテーブルから別のテーブルに動的に更新できます

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

于 2013-06-18T05:53:05.363 に答える