MySQLのトリガーとイベントスケジューラ
トリガーとは、自動的に実行されるストアドプロシージャのことです。データが変更されると、自動的にトリガーされます。
このレッスンでは、トリガーとイベントスケジューラについて解説します。
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. 学習内容
- BEFORE/AFTER トリガー
- 「NEW/OLD」キーワード
- トリガー管理
- イベント作成 イベントのスケジュール設定
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)となります。
📖 まとめ
- トリガーは、データが変更されると自動的に実行されます
- BEFORE 操作の前にトリガーされる; AFTER 操作の後にトリガーされる
- NEW は新しい値、OLD は以前の値です
- イベントスケジューラ は、スケジュールされたタスクを実装しています
📝 練習問題
-
基本問題(難易度:⭐):ユーザーテーブルへの変更を自動的にログに記録するトリガーを作成してください。
-
上級演習(難易度:⭐⭐):
updated_atフィールドを自動的に更新する BEFORE UPDATE トリガーを作成してください。 -
課題(難易度:⭐⭐⭐):毎日深夜0時に、30日前のログデータを削除するイベントスケジューラを作成してください。



