0

基本的な質問、ごめんなさい。基本的に、誰かがページにアクセスするたびにMySQLエントリを作成するスクリプトがあります。ロギングスクリプト。ただし、たとえば100回の訪問後に自動プルーニングを実行したいと思います。

たとえば、擬似コードの場合:

if amount of rows > 100 { delete rows 1+ until amount of rows == 100 }

つまり、一言で言えば、100の後に新しい行が追加されるたびに、最小のID(私の主キー)を持つ行を自動的に削除する必要があります。

4

2 に答える 2

0

ほとんどの場合、カウントを取得してから「正しい」量の古いレコードを削除するために、テーブルをロックする必要があります。したがって、SELECTを100行に制限し、不要なレコードであっても、より多くのレコードをテーブルに保持したいと思います。古いレコードは引き続き削除できます。たとえば、cronジョブを使用してx時間ごとに1回、または1マイルあたりxの確率でランダムに削除できます。

if ( 10 > rand(0, 8000) ) {
  LOCK TABLES foo
  SELECT COUNT(*) as cnt FROM foo
  if ( $cnt > 100 ) {
    $cnt -= 100;
    DELETE FROM foo ORDER BY id DESC LIMIT $cnt
  }
  UNLOCK TABLES
}

またはそのようなもの...

(私が知る限り、DELETEステートメントのORDER BYおよびLIMIT句はMySQL固有です。それを覚えておいてください。)

于 2010-05-09T07:45:30.520 に答える
0

もう1つの可能なオプションは、データベースTRIGGERS(http://forge.mysql.com/wiki/Triggers)を使用することです。

このシナリオではやり過ぎかもしれませんが、行が挿入されるたびにテーブルをチェックします。例(私はテストしていません!):

MyTableに挿入した後にトリガーprune_MyTableを作成します。各行の開始宣言num_rowsINTEGER; 宣言lowest_idINTEGER;

SELECT COUNT(*)INTO num_rows FROM MyTable;

num_rows> 100の場合、MIN(id)をMyTableLIMIT100からlowest_idに選択します。

UPDATE MyTable DELETE WHERE id <lowest_id;

END IF; END $$

于 2010-05-09T10:17:50.817 に答える