例1、MySQL、signal sqlstate
を使用して、トリガーへの挿入をキャンセルできます。
-
varchar列を使用してテーブルを作成します:
mysql> create table yar (val VARCHAR(25) not null); Query OK, 0 rows affected (0.02 sec)
-
「挿入前」トリガーを作成して、条件を確認し、許可しないようにします。
mysql> delimiter $$ mysql> create trigger foo before insert on yar -> for each row -> begin -> if new.val = '' then -> signal sqlstate '45000'; -> end if; -> end;$$ Query OK, 0 rows affected (0.01 sec)
-
条件が満たされた場所に挿入してみてください:
mysql> delimiter ; mysql> insert into yar values(""); ERROR 1644 (45000): Unhandled user-defined exception condition mysql> insert into yar values ("abc"); Query OK, 1 row affected (0.01 sec) mysql> select * from yar; +-----+ | val | +-----+ | abc | +-----+ 1 row in set (0.00 sec)
空白の文字列を挿入すると、トリガーはそれが空白であることを確認し、挿入を防ぐために信号を上げました。
例2、MySQL、データをnull以外の制約に違反させることにより、トリガーへの挿入をキャンセルします。
-
varchar列を使用してテーブルを作成します:
mysql> create table yar (val VARCHAR(25) not null); Query OK, 0 rows affected (0.02 sec)
-
「挿入前」トリガーを作成して、条件を確認し、許可しないようにします。
mysql> delimiter $$ mysql> create trigger foo before insert on yar -> for each row -> begin -> if new.val = '' then -> set new.val = NULL; -> end if; -> end;$$ Query OK, 0 rows affected (0.01 sec)
-
条件が満たされた場所に挿入してみてください:
mysql> delimiter ; mysql> insert into yar values(""); ERROR 1048 (23000): Column 'val' cannot be null mysql> insert into yar values ("abc"); Query OK, 1 row affected (0.01 sec) mysql> select * from yar; +-----+ | val | +-----+ | abc | +-----+ 1 row in set (0.00 sec)
空白の文字列を挿入しましたが、トリガーはそれが空白であることを確認し、値をnullに変更したため、挿入が禁止されています。