404 Not Found

404 Not Found


nginx

MySQLのトリガーとイベントスケジューラ

トリガーとは、自動的に実行されるストアドプロシージャのことです。データが変更されると、自動的にトリガーされます。

このレッスンでは、トリガーとイベントスケジューラについて解説します。

100%
graph TB
    A[Data Change Events] --> B{Trigger Conditions}
    B -->|BEFORE| C[Triggered before the operation]
    B -->|AFTER| D[Triggered after the operation]
    C --> E[BEFORE INSERT<br/>Pre-insertion Validation/Edit]
    C --> F[BEFORE UPDATE<br/>Pre-update Validation/Edit]
    C --> G[BEFORE DELETE<br/>Verify Before Deleting]
    D --> H[AFTER INSERT<br/>Post-insertion synchronization]
    D --> I[AFTER UPDATE<br/>Update Log]
    D --> J[AFTER DELETE<br/>Clean Up After Deletion]
    A --> K[Event Scheduler]
    K --> K1[Scheduled Execution]
    K --> K2[A one-time event]

1. 学習内容


2. 実話

(1) 課題:手作業では見落としが生じやすい

ECシステムが本番稼働を開始すると、運用チームからは毎日のように不満の声が上がりました。注文が入っても在庫が差し引かれない、価格変更後も監査ログが更新されない、期限切れのセッションが蓄積してクエリの処理が遅くなるといった問題が発生していたのです。開発チームはビジネスロジックに処理を追加し続けましたが、誰かが必ず何かを忘れてしまうという状況が続きました。各サービスのコードが独立して記述されていたため、システム全体での一貫性を確保する手段がそもそもなかったのです。

(2) トリガーとイベントを用いた解決策

トリガーを使用して、データベースレベルでの処理を自動化します。たとえば、注文が入った後に在庫を差し引いたり、変更を行った後にその変更内容をログに記録したりします。また、イベントスケジューラを使用して、有効期限が切れたデータを定期的に削除します。

ディメンション アプリケーションレベルのロジック データベースの自動化
見落としのリスク 高(開発者次第) なし(自動的にトリガーされる)
サービス間の整合性 確保が困難 統合データベース層
運用上の負担 スケジュールされたタスクの展開が必要 組み込みのイベントスケジューラ
信頼性 中程度 最高

3. トリガーの基礎

▶ 例:AFTER INSERT トリガー

SQL
DELIMITER //
CREATE TRIGGER trg_after_insert_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
    INSERT INTO user_logs (user_id, action, created_at)
    VALUES (NEW.id, 'INSERT', NOW());
END //
DELIMITER ;
▶ 試してみよう

▶ 例:BEFORE UPDATE トリガー

SQL
DELIMITER //
CREATE TRIGGER trg_before_update_user
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
    SET NEW.updated_at = NOW();
    
    IF NEW.email != OLD.email THEN
        SET NEW.email_verified = FALSE;
    END IF;
END //
DELIMITER ;
▶ 試してみよう

4. 「NEW」と「OLD」というキーワード

トリガー 新規 既存
INSERT 新規に挿入された行 データなし
更新 修正後の値 元の値
削除 利用不可 削除された行

5. トリガーの管理

SQL
-- View Triggers
SHOW TRIGGERS;

-- Delete Trigger
DROP TRIGGER IF EXISTS trg_after_insert_user;

6. イベントスケジューラ

▶ 例:スケジュールされたタスク

SQL
-- Start the Event Scheduler
SET GLOBAL event_scheduler = ON;

-- Create an event that runs daily
CREATE EVENT evt_daily_cleanup
ON SCHEDULE EVERY 1 DAY
STARTS '2026-07-04 02:00:00'
DO
    DELETE FROM temp_data WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

-- Create a One-Time Event
CREATE EVENT evt_one_time
ON SCHEDULE AT '2026-07-10 00:00:00'
DO
    UPDATE promotions SET status = 'expired' WHERE end_date < CURDATE();
▶ 試してみよう

❓ よくある質問

Q トリガーは他のテーブルを変更できますか?
A はい。トリガーは他のテーブルに対してINSERT、UPDATE、DELETE操作を実行できます。
Q トリガーはパフォーマンスに影響しますか?
A トリガーは行ごとに実行されるため、バッチ処理の際にはその影響が顕著になります。使用には注意が必要です。
Q イベントスケジューラはデフォルトで有効になっていますか?
A デフォルトでは無効になっています。有効にするには SET GLOBAL event_scheduler = ON; が必要です。
Q トリガーは外部プログラムを呼び出すことができますか?
A いいえ。トリガーはSQL文のみを実行でき、オペレーティングシステムのコマンドや外部APIを呼び出すことはできません。
Q 1つのテーブルにつき、トリガーの最大数はいくつですか?
A 同じイベントに対して同時に実行されるトリガーは1つだけです。つまり、1つのテーブルにつき最大6つのトリガー(BEFORE/AFTER × INSERT/UPDATE/DELETE)となります。

📖 まとめ


📝 練習問題

  1. 基本問題(難易度:⭐):ユーザーテーブルへの変更を自動的にログに記録するトリガーを作成してください。

  2. 上級演習(難易度:⭐⭐)updated_at フィールドを自動的に更新する BEFORE UPDATE トリガーを作成してください。

  3. 課題(難易度:⭐⭐⭐):毎日深夜0時に、30日前のログデータを削除するイベントスケジューラを作成してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%