触发器是由 事件来触发 某个操作,这些事件包括 INSERT 、 UPDATE 、 DELETE 事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会 自动 激发触发器执行相应的操作。

1. 创建触发器

  1. CREATE TRIGGER 触发器名称
  2. {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
  3. FOR EACH ROW
  4. BEGIN
  5. 触发器执行的语句块;
  6. 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语句定义的触发器并不会被激活。