0

私はテーブルにたくさんのことINSERT DELAYEDをすることを計画しています。MyISAMただし、テーブルがまだ存在しない可能性があります。たとえば、毎日新しいテーブルが存在するとします。

したがって、クライアントにテーブルがないことを検出して作成し、挿入を再試行する代わりに、ストアド プロシージャ (「関数」) の適切なケースのように思えます。

これは可能ですか?それはどのように見えるでしょうか? このアプローチに欠点はありますか?

4

3 に答える 3

1

毎晩午前 0 時前に実行されるスケジュールされたイベントを作成し、翌日のログ テーブルを作成することは考えられません。INSERTそうすれば、何かが起こる前にテーブルが作成されることに常に頼ることができますか?

CREATE EVENT createLogTable
ON SCHEDULE EVERY 1 DAY  
STARTS '2010-6-20 23:59:00'   
DO
    BEGIN
        SET @tablename = CONCAT('my_logging_table-',DATE(DATE_ADD(NOW(),INTERVAL 1 DAY)));
        SET @query = CONCAT('CREATE TABLE IF NOT EXISTS`',@tablename,'` (`timestamp` INT,`event` VARCHAR( 20 )) ENGINE = MYISAM');
        PREPARE createStatement FROM @query;
        EXECUTE createStatement;
        DEALLOCATE PREPARE createStatement;
    END
于 2010-06-20T12:38:43.280 に答える
1

テーブルが存在するかどうかを挿入ごとに確認するのは時間の無駄のようです。日ごとのテーブルが必要な場合(私の意見では、データベースで通常見られるロジックの多くに逆らいます。そのため、避けようとします):

  1. 「my_logging_table」を挿入するデフォルトのテーブルを作成します。
  2. そのテーブルですべての挿入/更新/削除を行います。
  3. 毎日 cronjob を実行して昨日のテーブル ('my_logging_table-2010-06-15') を作成し、そこにすべての昨日のレコードを挿入します。その後、それらはメイン テーブルから削除されます。
  4. アプリケーションの書き直しが多すぎる場合は、現在のテーブル名と日付 ('my_logging_table-2010-06-16') を使用して更新可能なビューを作成し、'my_logging_table' に挿入するだけです。

別のアプローチは、MERGE テーブル ( http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.htmlを参照) で、毎日の cronjob が「今日の」テーブルを作成し、テーブルリストを更新します。 alter table ステートメントを使用したマージ テーブルの場合。

于 2010-06-16T19:58:43.693 に答える
0

同じことを達成するための良い計画を立てるかもしれません。

たとえば、毎日作成されるテーブル「Logged_users」がある場合、users テーブルに列を追加するか、ID_USER、DAY列を含む追加のテーブルを作成することができます (これがより良い選択です)。次に、過去の日のすべての行を削除する CRON ジョブをプログラムし、そのジョブを毎日午前 12:00 に実行することができます。

于 2010-06-17T02:16:44.957 に答える