トリガー(SQLiteを学ぶ_19)

SQLiteを学んでいこうという連載の19回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、複数のデータベースの取り扱いについてご紹介しました。複数のデータベース間でやり取りができると、データベースの使い方の幅が広がります。

今回はSQLiteの機能の1つであるトリガーです。いったいどんな機能なのでしょうか?

トリガー機能

トリガー機能とはSQL文で特定のテーブルが更新された際に、別のSQL文を自動的に実行するという機能です。実際の使用例を見ていきましょう。

データ追加時の記録を取る

データベースファイルにデータを登録した際に、別のテーブルに登録の記録を取るようにしてみましょう。 以下の手順でテーブルを作成します。

sqlite> CREATE TABLE sample(id INTEGER,name TEXT,age INTEGER);
sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);
sqlite> INSERT INTO sample VALUES(2,"YAMADA",30);
sqlite> INSERT INTO sample VALUES(3,"OOTA",27);

また、記録を取るためのテーブルも用意します。

sqlite> CREATE TABLE log_table(timestamp TEXT,id INTEGER);

次にトリガー機能を設定します。

sqlite> CREATE TRIGGER insert_data
   ...> AFTER INSERT ON sample
   ...> FOR EACH ROW
   ...> BEGIN
   ...>     INSERT INTO log_table(timestamp, id) VALUES(datetime('now'),NEW.id);
   ...> END;

この時点でのデータベースの状態を確認してみましょう。

sqlite> .mode line
sqlite> SELECT * FROM sqlite_master;
    type = table
    name = sample
tbl_name = sample
rootpage = 2
     sql = CREATE TABLE sample(id INTEGER,name TEXT,age INTEGER)

    type = table
    name = log_table
tbl_name = log_table
rootpage = 3
     sql = CREATE TABLE log_table(timestamp TEXT,id INTEGER)

    type = trigger
    name = insert_data
tbl_name = sample
rootpage = 0
     sql = CREATE TRIGGER insert_data
AFTER INSERT ON sample
FOR EACH ROW
BEGIN
    INSERT INTO log_table(timestamp, id) VALUES(datetime('now'),NEW.id);
END

2つのテーブルのほかに「type = trigger」として「insert_data」が作成されています。これが追加設定されたトリガー機能です。 この状態で以下のSQLを実行して、テーブル「sample」にレコードを追加してみましょう。

sqlite> INSERT INTO sample VALUES(4,"SASAKI",31);

実行後にそれぞれのテーブル内容を確認してみます。

sqlite> .mode qbox
sqlite> SELECT * FROM sample;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'YAMADA' │ 30  │
│ 3  │ 'OOTA'   │ 27  │
│ 4  │ 'SASAKI' │ 31  │
└────┴──────────┴─────┘
sqlite> SELECT * FROM log_table;
┌───────────────────────┬────┐
│       timestamp       │ id │
├───────────────────────┼────┤
│ '2023-07-30 07:21:33' │ 4  │
└───────────────────────┴────┘

「sample」にはレコードが追加され、「log_table」にはデータを追加した日時と追加したidが記録されています。 この様にトリガー機能を使用すると、データ変更(追記)時に記録を取ることができます。

次回は解説

いかがでしょうか。トリガー機能は結構便利そうですね。次回は今回の内容の解説です。また、その他の使い方についてもご紹介したいと思います。お楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから