MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例

MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例

MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例

最近のプロジェクト要件では、操作ログの数を 10 万件に制限しています。10 万件を超える場合は、最も古いログが削除され、データベースに保存されるログの数は 10 万件を超えません。
最初に考えたのはトリガーを使うことだったので、データベースで次の SQL を実行しました。

区切り文字 $
トリガー limitLog を作成する
前に
入れる
OperationLogで
各行ごとに
始める
(OperationLogからcount(*)を選択) > 100000の場合
OperationLog 制限 1 から削除します。
終了の場合;
終了$

区切り文字 ;

問題はないようです。挿入前にチェックが行われ、10万を超えると削除が実行されます。しかし、実際のデータベースが 100,000 レコードを超えると、IF ステートメントの実行開始時に問題が発生し、MySQL はエラーを報告します。

エラー 1442 (HY000): 保存されたテーブル 'OperationLog' を更新できません 
関数/トリガーは、呼び出されたステートメントによって既に使用されているため、 
この保存された関数/トリガー。

情報を調べてみると、トリガーの再帰的な無限ループの実行を防ぐために、MySQL では特定のテーブルのトリガー内でテーブルに直接 DML (SELECT、DELETE、UPDATE、INSERT) 操作を実行できないようになっていることがわかりました。もちろん、他のテーブルではそのような操作を実行できます。

トリガーは、テーブルで実行できる DML 操作を制限します。トリガーは、set キーワードを使用して、実行前または実行後に実行されるデータ行を変更できます。

区切り文字 $
トリガーsetLogを作成する
前に
入れる
OperationLogで
各行ごとに
始める
NEW.action = 'test' を設定します。
終了$

区切り文字 ;

上記のステートメントは、OpetationLog テーブルを挿入する前に、挿入されたデータのアクション フィールドの値がテストに更新されることを示しています。NEW は新しく追加されたフィールドを示し、OLD は削除されたときのフィールドを示します。アップデートの際はNEWとOLDを同時に使用できます。

一時的なトリガー

先ほど説明したトリガーは、特定のテーブルによって生成されたイベントに基づいてトリガーされますが、イベント スケジューラとも呼ばれる一時トリガーは、特定のタスクを実行するために特定の期間に基づいてトリガーされます。 MySQL のイベント スケジューラはタスクを 1 秒単位で正確に実行できますが、オペレーティング システムのスケジュールされたタスク (Linux の CRON や Windows のタスク スケジューリングなど) は 1 分に 1 回しか正確に実行できません。リアルタイムデータ(株価、オッズ、スコアなど)に対する要件が高いアプリケーションに非常に適しています。

この関数を使用する前に、event_schedulerが有効で実行可能であることを確認する必要があります。

 グローバルイベントスケジューラ = 1;

または

グローバルイベントスケジューラを ON に設定します。

イベント スケジューラが現在有効になっているかどうかを確認するには、次の SQL を実行します。

'event_scheduler' のような変数を表示します。

または

@@event_schedulerを選択します。

または

プロセスリストを表示します。

この記事の冒頭で述べた問題に関しては、このメカニズムは完璧に解決できます。

区切り文字 $
イベント limitLog を作成し、1 秒ごとにスケジュールを設定します。DO IF (select count(*) from OperationLog) > 100000 then delete from OperationLog limit 1;END IF $
 区切り文字 ;

実証された有効性

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQLデータベーストリガーの詳細な説明
  • MySQL ストアド プロシージャ、トリガー、イベント スケジューラの入門ガイド
  • MySQLトリガートリガー例の詳細な説明
  • MySQL トリガーの使用方法と利点と欠点の紹介
  • MySQLトリガーの使用
  • MySQLトリガーについて深く理解するための記事
  • MySQLトリガーの使用
  • MySQLトリガーの例の詳細な説明
  • 初心者から熟練者まで使えるMySQLデータベーストリガー

<<:  Nginx 仮想ホスト (IP ベース) を構成する 3 つの方法の詳細な説明

>>:  Vue で親子コンポーネントの値を双方向バインドするために v-model を使用するときに発生する問題と解決策

推薦する

LeetCode の SQL 実装 (197. 気温上昇)

[LeetCode] 197.気温上昇Weather テーブルが指定されている場合、前の日付 (昨...

モバイルの赤い封筒の雨機能ページを実装するための JavaScript HTML

この記事の例では、モバイル紅包雨機能ページを実現するためのHTMLの具体的なコードを共有しています。...

Docker イメージの作成、アップロード、プル、およびデプロイ操作 (Alibaba Cloud を使用)

学習プロセス中にプッシュ イメージが常にタイムアウトすることがわかったため、Alibaba Clou...

HTML/XHTML における img 画像タグの基本的な使用法の詳細な説明

画像タグは、Web ページに画像を表示するために使用されます。 HTML/XHTML 画像 <...

MySQL PHP 構文の簡単な分析

まずcharAt関数の基本的な構文を見てみましょう文字 = str.charAt(インデックス) c...

均一なアニメーション効果を実現するJavaScript

この記事の例では、JavaScriptで等速アニメーションを実装するための具体的なコードを参考までに...

Ubuntu での Subversion (SVN) の詳細なインストールと設定

ソフトウェア開発者であれば、Subversion に精通している必要があります。 Subversio...

HTML テーブル マウス ドラッグ ソート機能

効果画像: 1. ファイルをインポートする<script src="js/jquer...

MySQL 5.7.18 アーカイブ圧縮版のインストールチュートリアル

この記事では、MySQL 5.7.18アーカイブ圧縮版をインストールする具体的な方法を参考までに紹介...

docker compose の記述ルールについての簡単な説明

この記事ではクラスタの展開に関連する内容は紹介しませんバージョン制約Docker エンジン >...

CentOS 8 インストール図 (超詳細なチュートリアル)

CentOS 8 が正式にリリースされました! CentOS は Red Hat の再配布ポリシー...

Webフロントエンド開発経験の概要

XMLファイルは、可能な限りutf-8でエンコードする必要があります。gb2312には、?など、保存...

MySQLパラダイムの使用に関する詳細な説明

1. パラダイムこのパラダイムの英語名は Normal Form であり、1970 年代にリレーショ...

Vue3 のレンダリング関数における互換性のない変更の詳細な説明

目次レンダリングAPIの変更レンダリング関数のパラメータレンダリング関数のシグネチャの変更VNode...

MySQLスレーブのメンテナンスに関する経験の共有

序文: MySQL マスター/スレーブ アーキテクチャは、最も一般的に使用されるアーキテクチャ セッ...