触发器
1.触发器的基本介绍:其创建的样式类似于存储函数和存储过程,但是与存储函数和存储过程不同,触发器的调用触发是经过预先规定的,而不在是通过手动输入代码进行调用。
主要功能:一般用于一个表中的数据改变时,与之相关联的表的更新(因为表的相关性,相关表的数据在原表改变后也需要进行更新同一,如果全部手动操作一遍则过于繁琐,因此引入了触发器的概念)
触发器的基本语句形式:
1 CREATE TRIGGER 触发器名称 2 BEFORE/AFTER(操作执行前还是执行后触发) INSERT/UPDATE/DELETE(针对哪种操作会触发) ON 表名(对哪个表起作用) 3 FOR EACH ROW #每执行一行触发一次 4 触发器执行的语句块;
实例:
1 DELIMITER // 2 CREATE TRIGGER before_insert_test_tri 3 BEFORE INSERT ON test_trigger 4 FOR EACH ROW 5 BEGIN 6 INSERT INTO test_trigger_log(t_log) 7 VALUES ("before_insert"); 8 END // 9 DELIMITER;
2.有关触发器的实际应用:
(1).
1 #实例问题解决1 2 #向test_trigger数据表插入数据后,向test_trigger_log插入after_insert的信息日志 3 DELIMITER // 4 CREATE TRIGGER after_insert 5 AFTER INSERT ON test_trigger 6 FOR EACH ROW #此行记得不要遗忘! 7 BEGIN 8 INSERT INTO test_trigger_log(t_log) 9 VALUES("after insert"); 10 END // 11 DELIMITER;
(2).
1 #实例问题解决2 2 #基于员工表的INSERT事件,在INSERT之前检查新员工薪资是否大于他领导的薪资,如果大于则认为是非法操作 3 #则报sqlstate_value为'HY000'的错误,使得添加失败 4 DELIMITER // 5 CREATE TRIGGER salary_check_trigger 6 BEFORE INSERT ON employees 7 FOR EACH ROW 8 BEGIN 9 DECLARE mgr_sal DOUBLE; 10 SELECT salary INTO mgr_sal FROM employees 11 WHERE employee_id = new.manager_id;#new就表示所目前所插入的这个元组 12 13 IF (new.salary > mgr_sal) 14 THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = "薪资有误";#该行即输出错误信息 15 END IF; 16 17 END // 18 DELIMITER;
(3).
1 #3. 创建触发器emps_del_trigger,每当向emps表中删除一条记录时,同步将删除的这条记录添加到emps_back1表中 2 DELIMITER // 3 CREATE TRIGGER emps_del_trigger 4 AFTER DELETE ON emps 5 FOR EACH ROW 6 BEGIN 7 INSERT INTO emps_back1(employee_id,last_name,salary) 8 VALUES (old.employee_id,old.last_name,old.salary);#old表示所目前所插入的这个元组 9 END // 10 DELIMITER;
2.触发器的删除
DROP TRIGGER 触发器名;
实例:
1 DROP TRIGGER emps_del_trigger;