触发器用于在触发器事件之前或之后激活某些内容。

概念

触发器Trigger是数据库提供给数据库管理员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,是用户定义在表上的一类由事件驱动的特殊过程。触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发的。其中,事件是指用户对表的增INSERT、删DELETE、改UPDATE等操作。触发器经常被用于加强数据的完整性约束和业务规则等。
触发器可以是INSERT、DELETE或UPDATE

  1. INSERT:无论何时通过INSERT、REPLACE或LOAD DATA语句插入新行,都会激活INSERT触发事件。
  2. UPDATE:通过UPDATE语句激活UPDATE触发事件。
  3. DELETE:通过DELETE或REPLACE语句激活DELETE触发事件。

    示例

    如希望将薪水插入到salaries表之前对其进行四舍五入。
  1. DROP TRIGGER IF EXISTS salary_round;
  2. DELIMITER $$
  3. CREATE TRIGGER salary_round BEFORE INSERT ON salaries
  4. FOR EACH ROW
  5. BEGIN SET NEW.salary = ROUND(NEW.salary);
  6. END
  7. $$
  8. DELIMITER ;

再把数据insert到表salaries中,salary字段就会自动四舍五入。

INSERT INTO salaries VALUES (1001,1000.78,curdate(),'9999-01-01')

和存储过程的区别

存储过程是由用户或应用程序显式地调用的,而触发器是不能被直接调用的,而是由一个事件来触发运行,即触发器是当某个事件发生时自动地隐式运行。

触发器的作用

  1. 可以维护数据库的安全性、一致性和完整性。
  2. 可以在写入数据之前,强制检验或转换数据。
  3. 当触发器发生错误时,异常的结果会被撤销。
  4. 部分数据库管理系统可以针对数据库定义语言DDL使用触发器,称为DDL触发器,还可以针对视图定义替代触发器。

    触发器的优缺点

    优点:触发器可通过数据库中的相关表实现级联更改。从约束的角度而言,触发器可以定义比CHECK更为复杂的约束。与CHECK约束不同的是,触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的数据来比较更新数据,以及执行其他操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表的状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、DELETE或UPDATE)允许采取多个不同的对策以响应同一个修改语句。
    缺点:滥用会造成数据库及应用程序的维护困难。在数据库操作中,可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时,规则、约束、缺省值也是保证数据完整性的重要保障。如果对触发器过度地依赖,那么将会影响数据库的结构,同时增加了维护的复杂性。