1 为什么使用触发器
触发器是mysql的数据库对象之一,那为什么要使用触发器呢?在开发具体项目时,经常会遇到如下实例:
* 在学生表中拥有字段学生姓名,字段学生总数,每当添加一条关于学生记录时,学生的总数就必须同时改变。
* 在顾客信息表中拥有字段顾客名字,字段顾客的电话和字段顾客的地址,每当添加一条顾客记录时,都需要检查电话号码格式是否正确,顾客地址是否正确。
上述实例虽然所需实现的业务逻辑不同,但是他们有共同之处,即都需要在表中发生改变时,自动进行一些处理。这时就可以使用触发器处理数据库对象。例如,对第一个实例,可以创建一个触发器对象,每添加一条学生记录,就执行一次计算学生总数的操作。
mysql软件在触发如下语句时,就会自动添加所设置的操作:
INSERTE语句。
DELETE语句。
UPDATE语句。
其他sql语句则不会激活触发器,mysql5软件才开始支持触发器数据库对象。
2 创建触发器
2.1创建一条执行语句的触发器
语法形式:create trigger trigger_name
BEFORE|AFTER trigger_EVENT
ON TABLE_NAME FOR EACH ROE trigger_STMT
trigger_name:表示创建触发器的名称。
BEFORE和AFTER指定触发器执行的时间,其中前者是指在触发器事件之前,执行触发器执行语句,后者指在触发器执行之后执行触发器语句。
trigger_EVENT:表示触发事件,即触发器执行条件,包含INSERTE语句, DELETE语句,UPDATE语句。
TABLE_NAME :表示操作表的名字。
FOR EACH ROE:表示任意一条记录上的操作满足触发器都会执行。
tigger_STMT:表示激活触发器后执行的语句。
例:部门表t_dept 和日记表t_diary创建触发器实现向部门表中插入记录就会再插入之前向日记表中插入当前时间。
sql语句:CREATE TRIGGER tri_diarytime
BEFORE INSERT ON t_dept FOR EACH ROW
INSERT INTO t_diary VALUES(NULL,'t_dept',now());
为了校验触发器的功能向表中t_dept插入一条记录
INSERT INTO t_dept VALUES(1,'test','shangxi');
SELECT*FRON t_diary;
2.2创建多条语句的触发器
语法形式:create trigger trigger_name
BEFORE|AFTER trigger_EVEVT ON TABLE_NAME FOR EACH ROW
BEGIN trigger_STMT
END
例:创建触发器tri_diarytime2
sql语句:
DELIMITER $$
CREATE TRIGGER tri_diarytime2
AFTER INSERT ON t_dept FOR EACH ROW
BEGIN
INSERT INTO t_diary VALUSE(NULL,‘t_dept’,now());
INSERT INTO t_diary VALUSE(NULL,‘t_dept’,now());
END
$$
DELIMITER;