PostgreSQLのトリガーとインデックスの基本

PostgreSQLのトリガーは、特定のデータベースイベントが発生した際に自動的に実行されるコールバック関数です。

以下はPostgreSQLトリガーに関する重要なポイントです:

  • トリガーは以下のタイミングで動作します:
  • 操作前(制約チェックおよび挿入、更新、削除試行前)。
  • 操作後(制約チェックおよび挿入、更新、削除完了後)。
  • 更新操作(ビューに対する挿入、更新、削除時)。
  • 「FOR EACH ROW」属性はオプションであり、選択すると各行の変更時に一度呼び出されます。「FOR EACH STATEMENT」を選択すると、何行変更されても1回だけ実行されます。
  • WHEN句とトリガーアクションは、NEW.col_nameおよびOLD.col_name形式を使用して各要素にアクセスできます。ここでcol_nameはトリガーに関連付けられたテーブルの列名です。
  • WHEN句がある場合、条件が満たされた行に対してのみSQL文が実行されます。条件がない場合、すべての行に対して実行されます。
  • BEFOREまたはAFTERキーワードは、トリガーのアクションがいつ実行されるかを決定します。

構文

トリガーを作成する基本的な構文は次の通りです:

CREATE TRIGGER trg_name [BEFORE|AFTER] event_name ON tbl_name
[ -- トリガー論理...
];

ここではevent_nameはtbl_name上でINSERT、DELETE、UPDATEなどのデータベース操作です。必要に応じて「FOR EACH ROW」を指定できます。

次はUPDATE操作に基づいて特定の列にトリガーを作成する構文です:

CREATE TRIGGER trg_name [BEFORE|AFTER] UPDATE OF col_name ON tbl_name
[ -- トリガー論理...
];

実例

COMPANYテーブルに挿入される各レコードの監査ログを保持する例を示します:

db=# CREATE TABLE COMPANY(
   ID SERIAL PRIMARY KEY,
   NAME TEXT NOT NULL,
   AGE INT NOT NULL,
   ADDRESS VARCHAR(50),
   SALARY REAL
);

AUDITテーブルを新規作成し、COMPANYテーブルへの挿入ごとにログメッセージを記録します:

db=# CREATE TABLE AUDIT_LOG(
   EMP_ID INT NOT NULL,
   LOG_DATE TIMESTAMP NOT NULL
);

COMPANYテーブル上にトリガーを作成します:

db=# CREATE TRIGGER ins_audit AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE FUNCTION log_func();

log_func()は次のように定義されています:

CREATE OR REPLACE FUNCTION log_func() RETURNS TRIGGER AS $$
BEGIN
   INSERT INTO AUDIT_LOG(EMP_ID, LOG_DATE) VALUES (NEW.ID, CURRENT_TIMESTAMP);
   RETURN NEW;
END;
$$ LANGUAGE plpgsql;

COMPANYテーブルにデータを挿入します:

db=# INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY) VALUES ('John', 28, 'NYC', 30000.00);

同様に、更新や削除時のトリガーも作成可能です。

トリガーの一覧表示

pg_triggerテーブルから現在のデータベースのすべてのトリガーをリストアップできます:

db=# SELECT tgname FROM pg_trigger JOIN pg_class ON tgrelid=pg_class.oid WHERE relname='company';

結果例:

tgname
---------
ins_audit
(1 row)

トリガーの削除

トリガーを削除する基本的な構文は次の通りです:

DROP TRIGGER trg_name ON tbl_name;

例えば、companyテーブル上のins_auditトリガーを削除するには:

DROP TRIGGER ins_audit ON company;

PostgreSQLのインデックス

インデックスはデータ検索を高速化するための特殊なテーブルクエリです。簡単に言えば、インデックスはテーブル内のデータを指すポインタです。

インデックスはSELECTクエリやWHERE句を高速化しますが、UPDATEやINSERT操作のパフォーマンスを低下させる可能性があります。

CREATE INDEX コマンド

CREATE INDEXの基本構文は次の通りです:

CREATE INDEX idx_name ON tbl_name(col_name);

インデックスタイプ

単一カラムインデックス

単一カラムインデックスは1つのカラムに基づいて作成されます:

CREATE INDEX idx_name ON tbl_name(col_name);

組み合わせインデックス

複数のカラムに基づくインデックスです:

CREATE INDEX idx_name ON tbl_name(col1_name, col2_name);

ユニークインデックス

ユニークインデックスは重複を防ぐために使用されます:

CREATE UNIQUE INDEX idx_name ON tbl_name(col_name);

DROP INDEX

インデックスを削除するには次のようにします:

DROP INDEX idx_name;

インデックスを使用すべきでない状況:

  • 小規模なテーブルでは不要です。
  • 大量の更新や挿入操作のあるテーブルでは非効率です。
  • 多くのNULL値を持つカラムでは不適切です。
  • 頻繁に操作されるカラムでは避けます。

タグ: PostgreSQL トリガー インデックス

5月26日 01:57 投稿