MYSQL【トリガ】シンプルで実用的

2718 ワード

1、トリガとは何かを知っていますか.
       mysqlのトリガは、ストレージ・プロシージャと同様にmysqlに埋め込まれたプログラムであり、トリガは、挿入、更新、削除などの文を含むイベントによってアクションをトリガします.トリガが定義されている場合、トリガは対応する操作をトリガします.
       トリガ(trigger)は特殊なストレージプロセスであり、異なるのは、ストレージプロセスを実行するにはCALL文を使用して呼び出すが、トリガの実行にはCALL文を使用して呼び出す必要はなく、手動で起動する必要もなく、事前に定義されたイベントが発生するとMYSQLによって自動的に呼び出される.たとえば、fruitsテーブルを操作(INSERT、DELETE、UPDATE)すると、実行がアクティブになります.トリガは、他のテーブルを問い合わせることができ、複雑なSQL文を含めることができます.これらは、主に複雑なビジネス・ルールまたは要件を満たすために使用されます.たとえば、顧客の現在のアカウントステータスに基づいて、新規受注の挿入を許可するかどうかを制御できます.この項では、トリガの作成方法について説明します.
NEW OLDと詳しく説明する
上記の例ではNEWキーが使用されており、MS SQL ServerのINSERTEDやDELETEDと同様に、MySQLではNEWとOLDが定義されています.
トリガのあるテーブルでは、トリガのローデータがトリガされます.具体的には、INSERT型フリップフロップにおいて、NEWは、(BEFORE)またはすでに(AFTER)挿入される新しいデータを表すために使用される.UPDATE型フリップフロップでは、OLDは、変更されるべきまたは変更された元のデータを表し、NEWは、変更されるべきまたは変更された新しいデータを表す.DELETE型フリップフロップでは、OLDは、削除される元のデータまたは削除された元のデータを表すために使用される.使用方法:NEW.columnName(columnNameは対応するデータテーブルのカラム名)また、OLDは読み取り専用であり、NEWはトリガでSETを使用して値を割り当てることができ、トリガが再びトリガーされず、ループコール(学生を挿入するたびに、その学号の前に「2013」を付けるなど)が発生します.
      使用 トリガは、同じテーブルと同じイベントに対して1つのトリガしか作成できないことに特に注意してください.
     不要なトリガをタイムリーに削除します.
2、トリガーの表示
show TRIGGERS;

3、トリガーの削除
drop trigger [trigger_name];

4、トリガの作成
次の例で説明します.
4.1、業務統計表の作成
CREATE TABLE `persons` (
  `name` varchar(40) NOT NULL,
  `num` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='     ';

4.2、販売表の作成
CREATE TABLE `sales` (
  `name` varchar(40) NOT NULL,
  `sum` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='    ';

4.3、トリガーの作成
CREATE TRIGGER num_sum AFTER INSERT on persons 

for EACH ROW INSERT INTO sales VALUES(NEW.name,7*NEW.num);

4.4、person表に記録を挿入する
INSERT into persons VALUES('zhangsan',20),('laidefa',24);

5、もっと複雑な論理を
学生表: 
create TABLE student(
  stuid int not null,
  classid int not null
 )

クラス表:
CREATE table class (
 classid int not null,
 stuCount int DEFAULT 0
)

ビジネスニーズ:
新規学生(student)の場合、クラス総数を自動的に計算します.
CREATE TRIGGER stu_class BEFORE INSERT on student
 for each row 
 BEGIN
    DECLARE a INT DEFAULT 0;
    DECLARE b INT DEFAULT 0;
    set a = (select stuCount from class WHERE classid = NEW.classid);
	IF a=0 or ISNULL(a) THEN    
	   set b = (SELECT count(*) from student WHERE classid = NEW.classid);
	   if ISNULL(b) THEN
		  SET b = 0;
	   END if;
	   INSERT INTO class VALUES(NEW.classid,b);
	   SET a=b;
	END IF;
	UPDATE class c SET c.stuCount = a+1 WHERE c.classid = NEW.classid;
END