触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL
也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。
创建触发器
语法如下:
CREATE TRIGGER trigger_name /*触发器名称*/
trigger_time /*触发程序的时间*/
trigger_event /*激活触发程序的事件类型*/
ON table_name /*针对的表名*/FOR EACH ROW trigger_stmt /*sql事件*/
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
触发程序与命名为table_name的表相关。table_name必须引用永久性表。不能将触发程序与临时表表或视图关联起来。
trigger_time:取值可以是BEFORE或者是AFTER,它是触发程序的动作时间,指明触发程序是在激活它的语句之前或之后执行。
trigger_event:取值可以是INSERT,UPDATE,DELETE!指明了激活触发程序的语句的类型。
INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
注意:
对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。
例如,对于某一表,不能有两个BEFORE UPDATE触发程序。
但可以有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。
trigger_stmt:是当触发程序激活时执行的sql语句。:如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。这样,就能使用存储子程序中允许 的相同语句。
1.创建一个单执行语句的触发器
DROP TRIGGER IF EXISTS t_beforeinsert_on_trexpert;
CREATE TRIGGER t_beforeinsert_on_trexpert
BEFORE INSERT ON trexpert
FOR EACH ROW
BEGIN
SET @num=0;
SELECT sort INTO @num FROM trexpert ORDER BY sort DESC LIMIT 1;
SET new.sort=@num+1;
END;
DROP TRIGGER IF EXISTS t_beforeinsert_on_trexpert;
CREATE TRIGGER t_beforeinsert_on_trexpert
BEFORE INSERT ON trexpert
FOR EACH ROW
BEGIN
SET @num=0;
SELECT MAX(sort) INTO @num FROM trexpert;
SET new.sort=@num+1;
END;
2.创建有多个执行语句的触发器,语法如下:
CREATE TRIGGER t_beforeinsert_on_triggertest
BEFORE INSERT ON triggertest
FOR EACH ROW BEGIN
INSERT INTO triggertest2 SET testNumber = NEW.testId;
DELETE FROM triggertest3 WHERE testId= 1;
UPDATE triggertest4 SET testNumber = 3 + 1 WHERE testName='测试';
END
3.
查看触发器
查看触发器是指数据库中已存在的触发器的定义、状态、语法信息等。可以使用:SHOW TRIGGERS
4.删除触发器
DROP TRIGGER trigger_name;
DROP TRIGGER IF EXISTS t_beforeinsert_on_trexpert;