1. 程式人生 > >MYSQL【觸發器】簡單實用

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”)。

      使用 觸發器時需要特別注意,對於相同的表 和相同的事件,只能建立一個觸發器。

     及時刪除不再需要的觸發器.

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)時,自動計算班級(class)總人數

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