Mysqlテーブルを制限付きFIFOバッファー(キュー)としてどのように扱うことができますか。
目的は次のとおりです。
- 一度にテーブルに含めることができる行数はN個のみです。
- 行が挿入されると、最も古い行が削除され、行数がNとして維持されます。
plsはアプローチを提案します。
更新: 申し訳ありませんが、多くの人が質問をSTACKからFIFOキューに変更しました
Mysql 5を過ぎると、トリガーを使用してこれを実現できます。
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
次に、トリガーされたSQLは次のようになります。
DELETE FROM foo WHERE id NOT IN (SELECT id FROM foo ORDER BY id DESC LIMIT 10)
あなたはちょうどあなたのテーブルの数を得ることができます、そしてその40の場合; 最初の行を削除し、挿入したい行を挿入するだけです。
get count
if = 40
delete
insert
else
insert
確かに、テーブルの挿入時にAFTERトリガーを作成し、次のようなストアドプロシージャを呼び出すことができます。
delete from TableName where ID not in (select top N ID from TableName)
新しいものを挿入するときに、スタックは以前のコンテンツを削除しません。
ただし、このような構造が本当に必要な場合は、Trigger
挿入ごとにbeforeを記述してください。
行ではなくFIFO方式で固定数の列を処理することを除いて、これと同じFIFOの問題について考えていました。しかし、私の解決策はここに当てはまると思います。グーグルですばやく検索しても、MySQLのFIFOソリューション/例はあまり得られませんでした。
列ベースのシナリオは次のとおりです。データ(data1、data2、data3など)で使用できる列が10個に制限されており、10個の列をすべて埋めて、新しいデータを書き込む必要がある場合は、最も古いデータを上書きします。
私の解決策:最後に更新された列を追跡するために11番目の列を追加しました。したがって、新しいデータを書き込む必要がある場合、スクリプトは最新の更新された列を検索し、簡単な算術演算を使用して、最も古い列を特定するためにバックトラックし、新しいデータをその列に挿入します(すでにあったものはすべて上書きします)そこの)。同時に、「last_updated」列を更新したばかりの列で更新できます。
確かに、あなたの質問は特に列ではなく行に関するものでしたが、列に使用しているのと同じアプローチが行に機能しない理由がわかりません...たとえば、最後に更新された行を追跡する列を作成できます。新しい行を挿入することはありません。既存のものを上書きするだけです。
シナリオを完全にDBレベルで処理することを計画していませんでしたが、それは可能であるはずのようです。
最後に、このアプローチでは、データの行/列がNを超えないようにします。トリガーアプローチの多くは、非常に短時間であっても、「余分な」行の作成を必要とするようです。
ご参考までに
https://github.com/netkiller/mysql-fifo-plugin
これはmysqlのFIFOキューです。
レコードの一部をFIFOキューにプッシュできます。またはfifoキューからレコードをプルします。
:(しかし、それはテーブルのエンジンではありません。