MYSQL【トリガ】シンプルで実用的
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、トリガーの表示
3、トリガーの削除
4、トリガの作成
次の例で説明します.
4.1、業務統計表の作成
4.2、販売表の作成
4.3、トリガーの作成
4.4、person表に記録を挿入する
5、もっと複雑な論理を
学生表:
クラス表:
ビジネスニーズ:
新規学生(student)の場合、クラス総数を自動的に計算します.
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