文章目录

  • 1 触发器的概念
  • 2 触发器的创建
  • 2.1 语法
  • 2.2 举例
  • 3 查看、删除触发器
  • 3.1 查看
  • 3.2 删除触发器
  • 4 new与old
  • 5 优缺点
  • 5.1 优点
  • 5.2 缺点
  • 6 注意点


1 触发器的概念

  • 触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE、DELETE事件。
  • 所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会自动激发触发器执行相应的操作。
  • 当对数据表中的数据执行插入、更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现。

2 触发器的创建

2.1 语法

CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
触发器执行的语句块;

2.2 举例

CREATE DATABASE trigger_test;
USE trigger_test;

CREATE TABLE test_trigger ( 
	id INT PRIMARY KEY AUTO_INCREMENT,
	t_note VARCHAR ( 30 ) 
 );

CREATE TABLE test_trigger_log ( 
	id INT PRIMARY KEY AUTO_INCREMENT,
	t_log VARCHAR ( 30 ) 
 );

#举例1	
#创建触发器
#创建名称为before_insert_test_tri的触发器,向test_trigger数据表插入数据之前,向test_trigger_log数据表中插入before_insert的日志信息。
CREATE TRIGGER before_insert_test_tri BEFORE INSERT ON test_trigger FOR EACH ROW
BEGIN
		INSERT INTO test_trigger_log ( t_log )
	VALUES
	( 'before insert...' );
END;

#测试
INSERT INTO test_trigger ( t_note )
VALUES
	( 'test' );
	
	#查询
SELECT
	* 
FROM
	test_trigger;
SELECT
	* 
FROM
	test_trigger_log;
	

#举例2
#创建名称为after_insert_test_tri的触发器,向test_trigger数据表插入数据之后,向test_triggerIog数据表中插入after insert的日志信息。
CREATE TRIGGER after_insert_test_tri AFTER INSERT ON test_trigger FOR EACH ROW
BEGIN
		INSERT INTO test_trigger_log ( t_log )
	VALUES
	( 'after insert' );
END;

#测试
INSERT INTO test_trigger ( t_note )
VALUES
	( 'test2' );
	
	#查询
SELECT
	* 
FROM
	test_trigger;
SELECT
	* 
FROM
	test_trigger_log;
	
	
#举例3:
#定义触发器“salarycheck_trigger",基于员工表“employees"的INSERT事件,在INSERT之前检查将要添加的新员工薪资是否大于他领导的薪资,如果大于领导薪资,则报sqlstate_value为'HY000'的错误,从而使得添加失败。
CREATE TRIGGER salary_check_trigger BEFORE
	INSERT ON employees FOR EACH ROW
	BEGIN
		DECLARE
			manager_sal DOUBLE;#领导工资
#查询到要添加的数据的manager的薪资
		SELECT
			salary INTO manager_sal 
		FROM
			employees 
		WHERE
			employee_id = NEW.manager_id ;#new代表当前插入的数据
		IF
			NEW.salary > manager_sal THEN
				SIGNAL SQLSTATE 'HY000' 
				SET MESSAGE_TEXT = '薪资高于领导错误';
		END IF;
END;
#测试   1644 - 薪资高于领导错误
INSERT INTO employees( employee_id, last_name, email, hire_date, job_id, salary, manager_id )
VALUES
	( 300, 'Tom', 'tom@126.com', CURDATE(), 'AD_VP', 150000, 103 );

3 查看、删除触发器

3.1 查看

#方式一:查看所有触发器
SHOW TRIGGERS;
#方式二:查看指定触发器
SHOW CREATE TRIGGER salary_check_trigger;
#方式三:从系统库中查看
SELECT * FROM information_schema.`TRIGGERS`;

3.2 删除触发器

#删除
DROP TRIGGER before_insert_test_tri;

4 new与old

  • 当使用insert语句的时候,要插入的数据就是new。
  • 当使用delete语句的时候,要删除的那一条数据就是old。
  • 当使用update语句的时候,被修改的旧数据就是old,要修改为的新数据就是new。

5 优缺点

5.1 优点

  • 触发器可以确保数据的完整性。
  • 触发器可以帮助我们记录操作日志。
  • 触发器还可以用在操作数据前,对数据进行合法性检查。

5.2 缺点

  • 触发器最大的一个问题就是可读性差(A表插入数据时报B表插入数据错误)。
  • 相关数据的变更,可能会导致触发器出错。

6 注意点

注意,如果在子表中定义了外键约束,并且外键指定了ON UPDATE/DELETE CASCADE/SET NULL子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,此时基于子表的UPDATE和DELETE语句定义的触发器并不会被激活。