怎么在mysql中创建一个触发器
本篇文章为大家展示了怎么在mysql中创建一个触发器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
我们可以可以使用CREATE TRIGGER语句创建一个新的触发器,来看下具体的语法:
CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtable_nameFOREACHROWBEGIN...END;
然后我们来详细看下上述sql的具体含义:
将触发器名称放在CREATE TRIGGER语句之后。触发器名称应遵循命名约定[trigger time]_[table name]_[trigger event],例如before_employees_update。
触发激活时间可以在之前或之后。必须指定定义触发器的激活时间。如果要在更改之前处理操作,则使用BEFORE关键字,如果在更改后需要处理操作,则使用AFTER关键字。
触发事件可以是INSERT,UPDATE或DELETE。此事件导致触发器被调用。 触发器只能由一个事件调用。要定义由多个事件调用的触发器,必须定义多个触发器,每个事件一个触发器。
触发器必须与特定表关联。没有表触发器将不存在,所以必须在ON关键字之后指定表名。
将SQL语句放在BEGIN和END块之间。这是定义触发器逻辑的位置。
大概了解了之后,我们就来尝试创建触发器来记录employees表中行数据的更改情况,先来看下这个表的结构:
mysql>DESCemployees;+----------------+--------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+----------------+--------------+------+-----+---------+-------+|employeeNumber|int(11)|NO|PRI|NULL|||lastName|varchar(50)|NO||NULL|||firstName|varchar(50)|NO||NULL|||extension|varchar(10)|NO||NULL|||email|varchar(100)|NO||NULL|||officeCode|varchar(10)|NO|MUL|NULL|||reportsTo|int(11)|YES|MUL|NULL|||jobTitle|varchar(50)|NO||NULL||+----------------+--------------+------+-----+---------+-------+8rowsinset
我们再来创建一个名为employees audit的新表,用来保存employees表中数据的更改:
CREATETABLEemployees_audit(idINTAUTO_INCREMENTPRIMARYKEY,employeeNumberINTNOTNULL,lastnameVARCHAR(50)NOTNULL,changedatDATETIMEDEFAULTNULL,actionVARCHAR(50)DEFAULTNULL);
再来创建一个BEFORE UPDATE触发器,该触发器在对employees表中的行记录更改之前被调用:
DELIMITER$$CREATETRIGGERbefore_employee_updateBEFOREUPDATEONemployeesFOREACHROWBEGININSERTINTOemployees_auditSETaction='update',employeeNumber=OLD.employeeNumber,lastname=OLD.lastname,changedat=NOW();END$$DELIMITER;
在上述触发器的主体中,我们使用OLD关键字来访问受触发器影响的行的employeeNumber和lastname列。我们要注意的是,在为insert定义的触发器中,可以仅使用NEW关键字。不能使用OLD关键字。但是,在为DELETE定义的触发器中,没有新行,因此您只能使用OLD关键字。在update触发器中,OLD是指更新前的行,而NEW是更新后的行。
然后,我们可以使用SHOW TRIGGERS语句,来查看数据库中的触发器:
mysql>SHOWTRIGGERS;+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+|Trigger|Event|Table|Statement|Timing|Created|sql_mode|Definer|character_set_client|collation_connection|DatabaseCollation|+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+|before_employee_update|UPDATE|employees|BEGININSERTINTOemployees_auditSETaction='update',employeeNumber=OLD.employeeNumber,lastname=OLD.lastname,changedat=NOW();END|BEFORE|2017-08-0222:06:36.40|ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION|root@localhost|utf8|utf8_general_ci|utf8_general_ci|+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+1rowinset
完事我们就来更新employees表以检查触发器是否被调用:
UPDATEemployeesSETlastName='Maxsu'WHEREemployeeNumber=1056;
可以使用以下查询来查询employees_audit表,用以检查触发器是否被UPDATE语句调用:
mysql>SELECT*FROMemployees_audit;+----+----------------+----------+---------------------+--------+|id|employeeNumber|lastname|changedat|action|+----+----------------+----------+---------------------+--------+|1|1056|Hill|2017-08-0222:15:51|update|+----+----------------+----------+---------------------+--------+1rowinset
上述内容就是怎么在mysql中创建一个触发器,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。