触发器是由 事件来触发 某个操作,这些事件包括 INSERT 、 UPDATE 、 DELETE 事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会 自动 激发触发器执行相应的操作。
1. 创建触发器
CREATE TRIGGER 触发器名称{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名FOR EACH ROWBEGIN触发器执行的语句块;END
表名 :表示触发器监控的对象。
- BEFORE|AFTER :表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。
- INSERT|UPDATE|DELETE :表示触发的事件。
- INSERT 表示插入记录时触发;
- UPDATE 表示更新记录时触发;
- DELETE 表示删除记录时触发。
- 触发器执行的语句块 :可以是单条SQL语句,也可以是由BEGIN…END结构组成的复合语句块 ```plsql DELIMITER $
CREATE TRIGGER before_insert_test_tri
BEFORE INSERT ON test_trigger
FOR EACH ROW
BEGIN
INSERT INTO test_trigger_log(text) VALUES (‘before_log’);
END $
DELIMITER ;
```plsql
DELIMITER $
CREATE TRIGGER `before_insert_emp`
BEFORE INSERT ON `emp`
FOR EACH ROW
BEGIN
DECLARE sal DOUBLE;#NEW 表示每次插入的那一条数据 OLD 表示老的一条数据
SELECT salary INTO sal FROM emp WHERE `employee_id`=NEW.`manager_id`;
IF NEW.`salary` > sal
#SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT='高于领导工资'; 抛出一个error
THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT='高于领导工资';
END IF;
END $
DELIMITER ;
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用。
2. 查看触发器
查看当前数据库的所有触发器的定义
SHOW TRIGGERS
查看当前数据库中某个触发器的定义
SHOW CREATE TRIGGER 触发器名
从系统库information_schema的TRIGGERS表中查询“salary_check_trigger”触发器的信息。
SELECT * FROM information_schema.TRIGGERS;
3. 删除触发器
DROP TRIGGER IF EXISTS 触发器名称;
注意,如果在子表中定义了外键约束,并且外键指定了ON UPDATE/DELETE CASCADE/SET NULL子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,此时基于子表的UPDATE和DELETE语句定义的触发器并不会被激活。
