すでにいくつかの投稿があることは知っていますが、競合しているものもあります。
数千のエントリを持つテーブルを継承したプロジェクトを引き受けました。
問題は、テーブルに自動インクリメントIDフィールドがなく、そこに入力された最後の300行を抽出するように求められたことです。
テーブルから最後の300エントリを抽出することは可能ですか?「システム行ID」はありますか?
すでにいくつかの投稿があることは知っていますが、競合しているものもあります。
数千のエントリを持つテーブルを継承したプロジェクトを引き受けました。
問題は、テーブルに自動インクリメントIDフィールドがなく、そこに入力された最後の300行を抽出するように求められたことです。
テーブルから最後の300エントリを抽出することは可能ですか?「システム行ID」はありますか?
厳密な答えは、日付または順序を示す何かがない限り、「いいえ」です。テーブルは本質的に順不同です。
実際には、通常、データを入れた順序でフェッチして戻します。「1 つのプロセッサと 1 つのディスクのみを備えたシステムに、データを 1 回ロードしただけで、その後の挿入は行わなかった」という記述が真実であるほど、可能性が高くなります。データが実際に整っていること。
削除とその後の挿入が発生する可能性があるため、システム行 ID を持つことは役に立ちません。この場合、後のレコードは前のページに配置されます。
小さなテーブルがあります。select *
を実行し、データをスプレッドシートにコピーして、そこから作業を行います。
または、行番号が増加するテーブルを選択し、別のテーブルに挿入して、そこから選択することもできます。この疑似コードのようなもの:
insert into NewTable (seqnum, cols)
select :rownum=:rownum+1, cols
from YourTable
欲しいものが手に入るチャンスがあります。
最後に 1 点。 挿入を行い、挿入以降のログ ファイルがある場合は、そこから情報を取得できる可能性があります。少しの作業で。
これを試して:
SELECT col1, col2, ...
FROM (SELECT col1,col2, ..., (@auto:=@auto+1) indx
FROM tablename, (SELECT @auto:=1) AS a
) AS b
ORDER BY indx DESC
LIMIT 30
少なくともテーブルにレコード挿入時間があれば、これを使用できます。それ以外の場合はできません。
SELECT * FROM
yourtable
ORDER BY inserted_time desc limit 300;