MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでINSERT前にトリガーを使って挿入を停止・キャンセルする方法

BEFORE INSERTトリガーで挿入を停止する方法

MySQLでは、BEFORE INSERTトリガーとSIGNAL SQLSTATEを組み合わせることで、INSERT処理を実行前に中断(キャンセル)できます。トリガー内で条件をチェックし、条件を満たした場合にエラーを発生させることで、その挿入自体が取り消されます。

基本構文

構文は以下の通りです。

delimiter //
create trigger yourTriggerName before insert on yourTableName
    FOR EACH ROW
    BEGIN
        yourStatement1
        .
        .
        N
    END
//
delimiter ;

実例:合計値が60に達したら挿入を拒否する

構文の理解を深めるために、まずテーブルを作成しましょう。

mysql> create table DemoTable1919
    (
    Value int
    );
Query OK, 0 rows affected (0.00 sec)

次に、INSERTの前に実行されるトリガーを作成します。ここでは、テーブル内のValue列の合計が60になった時点で、それ以上の挿入を禁止するトリガーを定義しています。

mysql> delimiter //
mysql> create trigger sumis60 before insert on DemoTable1919
    FOR EACH ROW
    BEGIN
    declare custom_message varchar(256);
         IF (SELECT sum(Value) from DemoTable1919) = 60 THEN
            set custom_message= "cannot insert because sum(Value) is greater than 60";
             signal sqlstate '13500'
             set message_text= custom_message;
         END IF;
     END
     //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

トリガーの動作確認

それでは、INSERTコマンドでレコードを挿入し、トリガーが正しく機能するか確認してみましょう。

mysql> insert into DemoTable1919 values(10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1919 values(20);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1919 values(30);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1919 values(40);
ERROR 1644 (13500): cannot insert because sum(Value) is greater than 60

実行結果を見ると、10・20・30の挿入は成功しましたが、合計が60に達した後の40の挿入については、トリガーによってエラー(ERROR 1644 (13500))が発生し、拒否されたことがわかります。

ポイントのまとめ

  • BEFORE INSERTトリガーは、データが実際にテーブルに挿入される前に実行されます。
  • SIGNAL SQLSTATEを使うと、任意のSQLSTATEコードでエラーを発生させ、挿入処理を中断できます。
  • SET MESSAGE_TEXTでカスタムメッセージを指定すれば、エラー発生時に分かりやすいメッセージを表示できます。
  1. MySQLで二重引用符(ダブルクォート)付きのレコードを挿入する方法

    MySQLで二重引用符(ダブルクォート)を含むレコードを挿入するには、値の前後をバックスラッシュ(\)でエスケープします。具体的には、以下の構文のように記述します。構文insert into yourTableName values(\yourValue\);それでは、実際の手順を見ていきましょう。1. テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> Name varchar(20) -> );Query OK, 0 rows affected (0.63 sec)2

  2. MySQLでAUTO_INCREMENT(自動インクリメント)列をリセットする方法

    MySQLで自動インクリメント(AUTO_INCREMENT)列の値をリセットしたい場合は、TRUNCATE TABLEコマンドを使用します。テーブルをTRUNCATEすると、すべてのデータが削除されるとともに、AUTO_INCREMENTのカウンターも初期化されます。その後、新しくレコードを挿入すると、IDは再び1から採番されます。1. テーブルを作成するまず、AUTO_INCREMENT列を持つテーブルを作成します。mysql> create table DemoTable1888 ( Id int NOT NULL AUTO_INCREMENT, PRIMA