この問題は、BIGINT IDや分数のタイムスタンプなどの適切な設計によって完全に回避できますが、それは私の能力を超えています。MySQLで整数オーバフローを処理する場合
マシンは、整数IDと秒精度のタイムスタンプを使用して、MySQLデータベースにデータを送ります。それに応じてIDが増加し、すなわち1から91から181などのデータが90msごとに供給されている。このインクリメントは毎秒数回起こるので、同じタイムスタンプを有する異なるIDがある。また、IDフィールドは唯一の符号なしSMALLINTであるので、それは私が時間順のデータが必要です65536
に達するオーバーフローがあるので、簡単な
ORDER BY timestamp ASC, ID ASC
は、以下のような場合のために働くだろうタイムスタンプによってカバーされる第2の範囲内にはオーバーフローは存在しない。残念ながら、オーバーフロー、42、132および222は、65308前にソートなるだろうIDを提示65398および65488.
で何とかmin()
をどの範囲に指定して
ORDER BY
timestamp ASC,
If((min(ID)<10000) and (max(ID)>60000), If(ID<10000, ID+65536, ID), ID)
ような何かをする方法はありますmax()
が適用されますか?
EDIT 1:データはそうauto_increment
カラム必ずしも正しい時間的順序を反映しないであろう(私はさえ冗長かかわらず、レコードを分離するために)、バッチで添加されます。
EDIT 2:上部のイタリック体の行を参照してください。
別の自動インクリメントID列をテーブルに追加し、注文用に使用できますか? – PaulF
Paulと私はID列がAUTO_INCREMENTだとします...だがそれは?それとも、「マシン」が増えて、それを制御できないのですか? 純粋なMySQLに残っていると、カウンタはオーバーフローしますが、古いデータをパージするかREPLACEする必要があります。そうしないと、重複したキー入力エラーが発生します。これについてもう少し詳しく説明できますか? – YetiCGN
@ YetiCGN - テーブルの自動インクリメントとして定義された別のID列を提案していたので、マシン生成IDが自動インクリメントかラップアラウンドするかどうかは関係ありません。 – PaulF