2016-10-13 3 views
0

すべてのレコードをあるテーブルから別のテーブルに定期的にコピーする必要があります。レコードを失うことなくクエリデータベースをページングするにはどうすればよいですか?

フェッチレコードにはSELECT * FROM users LIMIT 2 OFFSET <offset>を使用します。以下のような

テーブルのレコード:私は最初のページ(USER_1、USER_2)をフェッチ

user_1 
user_2 
user_3 
user_4 
user_5 
user_6 

、レコード「USER_2は、」ソース表で削除されました。

そして、私は2番目のページを(user_4、user_5)、3番目のページ(user_6)を取り出しました。

これは、宛先テーブルでレコード "user_3"を失ったことにつながります。

実際のソーステーブルのレコード数は1000,000ですが、どうすれば問題を効果的に解決できますか?

+0

どのDBMSを使用していますか? –

+0

これは一回限りのコピーですか、両方を同期させておく必要があります – TheGameiswar

+0

私たちはMySQL、SQL Server、Oracleと互換性が必要です – tangjiujun

答えて

3

最初に、ソース表に一意の索引を使用し、順序句でそれを使用して、順序または行が時間の経過とともに一貫していることを確認する必要があります。次に、オフセットは使用せず、最後の要素をフェッチした後に開始します。

ような何か:初めて

SELECT * FROM users ORDER BY id LIMIT 2; 

、次のもののために、その後

SELECT * FROM users WHERE ID > last_recieved_id ORDER BY id LIMIT 2; 

これは、非同期削除の影響を受けません。


私はあなたが何の一意のインデックスを持っていませんが、あなたのテーブルに非ユニークなものを持っている、あなたはまだ非厳密な比較演算子と上記溶液を適用することができます。あなたは一貫して最後の行を再取得しますが、それは確かに限界2で壊れますが、それは合理的な値のために働くことができます。

他のさまざまな問題を引き起こすことが知られているインデックスがない場合、唯一の信頼できる方法は、単一の大きな選択をして、SQLカーソルを使用してページングすることです。

+0

はい、ソーステーブルにユニークインデックスがあり、それをオーダー句に使用できる場合、これは完璧なソリューションです。しかし、ソース表を変更できない可能性があり、ソース表にも固有の索引または制約がない可能性があります。 – tangjiujun

+0

この問題の一般的な解決策はありますか? @ tangjiujun; – tangjiujun

+0

;私の編集を参照してください... –

関連する問題