はじめに
本記事では、SQLiteにおけるトリガーの種類と設定方法をまとめます。
トリガーを使うことで、INSERT・UPDATE・DELETEの実行時に
自動的に別の処理を走らせることができます。
実行環境
| 項目 | 内容 |
|---|---|
| DB | SQLite 3.x |
| OS | Windows 11 |
1. トリガーとは
テーブルへの操作をきっかけに、自動実行されるSQL処理です。
INSERT / UPDATE / DELETE
↓
トリガー発火
↓
自動的に別のSQLが実行される
アプリケーション側に処理を書かずに、
DB側で自動的に処理を完結させることができます。
2. トリガーの種類
タイミングによる分類
| タイミング | 説明 |
|---|---|
BEFORE |
対象の操作が実行される前に発火 |
AFTER |
対象の操作が実行された後に発火 |
INSTEAD OF |
VIEWへの操作を代替処理に置き換える |
操作による分類
| 操作 | 説明 |
|---|---|
INSERT |
行が追加されたときに発火 |
UPDATE |
行が更新されたときに発火 |
DELETE |
行が削除されたときに発火 |
3. 基本構文
CREATE TRIGGER トリガー名
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON テーブル名
BEGIN
実行するSQL;
END;
4. 実践例
① AFTER INSERT:登録日時を自動記録する
-- ログテーブル
CREATE TABLE order_log (
id INTEGER PRIMARY KEY,
order_id INTEGER,
created_at TEXT
);
-- INSERTされたら自動でログを記録する
CREATE TRIGGER log_after_insert
AFTER INSERT ON order_table
BEGIN
INSERT INTO order_log (order_id, created_at)
VALUES (NEW.id, datetime('now', 'localtime'));
END;
NEWはINSERT・UPDATEで新しく追加・変更された行の値を参照します。
OLDはUPDATE・DELETEで変更前・削除された行の値を参照します。
② BEFORE DELETE:削除前に別テーブルへバックアップする
-- バックアップテーブル
CREATE TABLE order_backup (
id INTEGER,
part_id INTEGER,
quantity INTEGER,
deleted_at TEXT
);
-- 削除前にバックアップテーブルへ退避
CREATE TRIGGER backup_before_delete
BEFORE DELETE ON order_table
BEGIN
INSERT INTO order_backup (id, part_id, quantity, deleted_at)
VALUES (OLD.id, OLD.part_id, OLD.quantity, datetime('now', 'localtime'));
END;
③ AFTER UPDATE:更新履歴を記録する
-- 更新履歴テーブル
CREATE TABLE order_history (
id INTEGER PRIMARY KEY,
order_id INTEGER,
old_quantity INTEGER,
new_quantity INTEGER,
updated_at TEXT
);
-- UPDATEされたら変更前後の値を記録
CREATE TRIGGER log_after_update
AFTER UPDATE ON order_table
BEGIN
INSERT INTO order_history (order_id, old_quantity, new_quantity, updated_at)
VALUES (OLD.id, OLD.quantity, NEW.quantity, datetime('now', 'localtime'));
END;
5. トリガーの確認・削除
-- 登録済みトリガーの一覧確認
SELECT name, tbl_name, sql
FROM sqlite_master
WHERE type = 'trigger';
-- トリガーの削除
DROP TRIGGER IF EXISTS トリガー名;
6. NEW / OLD の参照可否まとめ
| 操作 | NEW | OLD |
|---|---|---|
| INSERT | ✅ 使える | ❌ 使えない |
| UPDATE | ✅ 使える | ✅ 使える |
| DELETE | ❌ 使えない | ✅ 使える |
まとめ
| 用途 | 使うトリガー |
|---|---|
| 登録日時の自動記録 | AFTER INSERT |
| 削除前のバックアップ | BEFORE DELETE |
| 更新履歴の保存 | AFTER UPDATE |
| VIEWへの書き込み処理 | INSTEAD OF |
トリガーを活用することで、アプリケーション側の処理を減らし
DBレベルで一貫した自動処理を実現できます。