MySQLトリガーで複数のステートメントを実行する方法|BEGIN…END構文の使い方を解説
MySQLのトリガーは、BEGIN…END構文を使用することで、複数のステートメントを実行できます。BEGINブロックの中には、ストアドルーチンで許可されている他の構文、たとえば条件分岐(IF文)やループ処理なども記述することが可能です。
複数ステートメント実行の仕組み
通常、トリガー本体には1つのステートメントしか記述できませんが、BEGINとENDで囲むことで、その内部に複数のSQLステートメントをまとめて記述できるようになります。これにより、より複雑なビジネスロジックをトリガー内に実装できます。
具体例:IF条件文を含むBEFORE INSERTトリガー
以下の例では、INSERT実行前に値を検証するBEFORE INSERTトリガーを作成しています。このトリガーはIF条件文を使用して、年齢(age)の値が0未満の場合は0に、100を超える場合は100に自動的に補正します。
mysql> CREATE TRIGGER before_insert_studentage BEFORE INSERT ON student_age FOR EACH ROW
BEGIN
IF NEW.age < 0 THEN SET NEW.age = 0;
ELSEIF NEW.age > 100 THEN SET NEW.age = 100;
END IF;
END //
Query OK, 0 rows affected (0.30 sec)
ポイント解説
- FOR EACH ROW: この指定により、対象テーブルの各行に対してトリガーが起動されます。
- NEW.age: 挿入されようとしている新しい行のageカラムの値を参照します。BEFORE INSERTトリガーでは、NEWの値を書き換えることが可能です。
- デリミタ(//): クライアント側でステートメントの区切り文字を「//」などに変更しておくと、トリガー本体内のセミコロン(;)が誤って解釈されるのを防げます。必要に応じて
DELIMITER //を事前に実行してください。
このようにBEGIN…END構文を活用すれば、条件分岐や変数操作などを組み合わせた柔軟なデータ検証・補正処理を、MySQLトリガー内で実現できます。
-
MySQLでINSERT前にトリガーを使って挿入を停止・キャンセルする方法
BEFORE INSERTトリガーで挿入を停止する方法 MySQLでは、BEFORE INSERTトリガーとSIGNAL SQLSTATEを組み合わせることで、INSERT処理を実行前に中断(キャンセル)できます。トリガー内で条件をチェックし、条件を満たした場合にエラーを発生させることで、その挿入自体が取り消されます。 基本構文 構文は以下の通りです。 delimiter // create trigger yourTriggerName before insert on yourTableName FOR EACH ROW BEGIN yourStateme
-
MySQLプログラムでオプションを指定する3つの方法と優先順位を解説
MySQLの各種プログラムでは、動作をカスタマイズするためにさまざまなオプションを指定できます。本記事では、MySQLプログラムにオプションを指定する主な方法と、それぞれの特徴・優先順位について詳しく解説します。1. コマンドラインで指定するプログラム名を入力した後に、コマンドライン上へ直接オプションを並べて指定する方法です。この方法は、その実行時にのみ適用したい一時的なオプションを指定する場合に最も一般的に使われます。2. オプションファイルで指定するプログラムが起動時に読み込むオプションファイル(my.cnf や my.ini など)にオプションを記述しておく方法です。毎回プログラムを実行