3

Mysqlテーブルを制限付きFIFOバッファー(キュー)としてどのように扱うことができますか。

目的は次のとおりです。

  1. 一度にテーブルに含めることができる行数はN個のみです。
  2. 行が挿入されると、最も古い行が削除され、行数がNとして維持されます。

plsはアプローチを提案します。

更新: 申し訳ありませんが、多くの人が質問をSTACKからFIFOキューに変更しました

4

6 に答える 6

4

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)
于 2012-04-04T19:17:33.433 に答える
0

あなたはちょうどあなたのテーブルの数を得ることができます、そしてその40の場合; 最初の行を削除し、挿入したい行を挿入するだけです。

get count 
if = 40
      delete
      insert
else
    insert
于 2012-04-04T19:16:27.607 に答える
0

確かに、テーブルの挿入時にAFTERトリガーを作成し、次のようなストアドプロシージャを呼び出すことができます。

delete from TableName where ID not in (select top N ID from TableName)
于 2012-04-04T19:18:59.823 に答える
0

新しいものを挿入するときに、スタックは以前のコンテンツを削除しません。

ただし、このような構造が本当に必要な場合は、Trigger挿入ごとにbeforeを記述してください。

于 2012-04-04T19:19:19.867 に答える
0

行ではなくFIFO方式で固定数の列を処理することを除いて、これと同じFIFOの問題について考えていました。しかし、私の解決策はここに当てはまると思います。グーグルですばやく検索しても、MySQLのFIFOソリューション/例はあまり得られませんでした。

列ベースのシナリオは次のとおりです。データ(data1、data2、data3など)で使用できる列が10個に制限されており、10個の列をすべて埋めて、新しいデータを書き込む必要がある場合は、最も古いデータを上書きします。

私の解決策:最後に更新された列を追跡するために11番目の列を追加しました。したがって、新しいデータを書き込む必要がある場合、スクリプトは最新の更新された列を検索し、簡単な算術演算を使用して、最も古い列を特定するためにバックトラックし、新しいデータをその列に挿入します(すでにあったものはすべて上書きします)そこの)。同時に、「last_updated」列を更新したばかりの列で更新​​できます。

確かに、あなたの質問は特に列ではなく行に関するものでしたが、列に使用しているのと同じアプローチが行に機能しない理由がわかりません...たとえば、最後に更新された行を追跡する列を作成できます。新しい行を挿入することはありません。既存のものを上書きするだけです。

シナリオを完全にDBレベルで処理することを計画していませんでしたが、それは可能であるはずのようです。

最後に、このアプローチでは、データの行/列がNを超えないようにします。トリガーアプローチの多くは、非常に短時間であっても、「余分な」行の作成を必要とするようです。

于 2013-05-17T03:55:05.070 に答える
0

ご参考までに

https://github.com/netkiller/mysql-fifo-plugin

これはmysqlのFIFOキューです。

レコードの一部をFIFOキューにプッシュできます。またはfifoキューからレコードをプルします。

:(しかし、それはテーブルのエンジンではありません。

于 2013-12-18T07:19:09.410 に答える