CREATE TRIGGER は、データベース内でトリガーを作成するためのSQL文です。
トリガーとは、指定されたイベント(INSERT / UPDATE / DELETE)が発生したときに自動的に実行されるストアドプロシージャのこと。
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN -- トリガーで実行されるアクション END;
このページでは、トリガーって何?という方でもCREATE TRIGGER文を利用してトリガーを開発できるようにサンプルコード付きでわかりやすく解説します。
プログラマーやエンジニアを目指す方であれば知っておきたい基本知識の1つです。是非最後までご覧ください。
【データベース】トリガーとは?
トリガーとは、データベースにおいて、特定のイベント(INSERT / UPDATE / DELETE)が発生したときに自動的に実行されるプログラムです。
指定したテーブルに何らかの変更が入ったことを検知した場合に動くプログラム、と理解できればOKです。
実際のコードを見ていくと処理内容が理解しやすくなるので、さっそくトリガーの作成方法(CREATE TRIGGER)を見ていきましょう。
CREATE TRIGGER(トリガーの作成)
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN -- トリガーで実行されるアクション END;
ポイントは以下の通り。
実際の使用例を見ていきます。まず、前提として以下2つのテーブル「従業員テーブル(employees)」と「従業員の給与履歴テーブル(salary_history)」を用意します。
-- 従業員テーブル CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), salary DECIMAL(10, 2) ); -- 従業員の給与履歴テーブル CREATE TABLE salary_history ( id INT AUTO_INCREMENT PRIMARY KEY, employee_id INT, old_salary DECIMAL(10, 2), new_salary DECIMAL(10, 2), changed_at TIMESTAMP );
次に、従業員の給与が更新されたときに自動的に "salary_historyテーブル" に記録を追加するトリガーを作成します。
DELIMITER // CREATE TRIGGER salary_change AFTER UPDATE ON employees FOR EACH ROW BEGIN INSERT INTO salary_history (employee_id, old_salary, new_salary, changed_at) VALUES (OLD.id, OLD.salary, NEW.salary, NOW()); END; // DELIMITER ;
このトリガーは、"employees" テーブルで "UPDATE" イベントが発生した後に実行され、給与が変更された従業員のID、古い給与、新しい給与、および変更日時をsalary_historyテーブルに挿入します。
実際に従業員の給与を更新して、トリガーが機能するかどうかを確認してみましょう。
-- 従業員の追加 INSERT INTO employees (first_name, last_name, salary) VALUES ('John', 'Doe', 50000); -- 従業員の給与を更新 UPDATE employees SET salary = 55000 WHERE id = 1; -- salary_historyテーブルの内容を確認 SELECT * FROM salary_history; /* 結果(salary_historyテーブル に値が追加された) +----+-------------+------------+------------+---------------------+ | id | employee_id | old_salary | new_salary | changed_at | +----+-------------+------------+------------+---------------------+ | 1 | 1 | 50000.00 | 55000.00 | 2023-03-17 14:52:10 | +----+-------------+------------+------------+---------------------+ */
ご覧のように、従業員の給与が更新されたときにsalary_changeトリガーが自動的に実行され、salary_historyテーブルに変更履歴が追加されます。このように、トリガーを使用することで、データベースの一貫性を維持し、追跡や監査が容易になります。
トリガーのメリット・デメリット
一見便利そうに見えるトリガーですが、メリットもあればデメリットもあります。
一方でトリガーは以下のようなデメリットが存在します。
個人的にはトリガー(trigger)は「それ以外の手段がない場合」にのみ利用する、というのがおすすめです。
トリガーを利用すると、業務ロジックがアプリケーション側とデータベース側に分かれて存在してしまうことになるため、一気にシステム全体の複雑性が増します。
どうしても、トリガーを利用しないといけない・・・という場合を除いて、基本的にはアプリケーション側での実装にするのがおすすめです。
SQLを1から学習したい方は
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。
SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。