mysql触发器之创建使用触发器简单示例
本文实例讲述了mysql触发器之创建使用触发器。分享给大家供大家参考,具体如下:
我们可以可以使用CREATETRIGGER语句创建一个新的触发器,来看下具体的语法:
CREATETRIGGERtrigger_nametrigger_timetrigger_event ONtable_name FOREACHROW BEGIN ... END;
然后我们来详细看下上述sql的具体含义:
- 将触发器名称放在CREATETRIGGER语句之后。触发器名称应遵循命名约定[triggertime]_[tablename]_[triggerevent],例如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
我们再来创建一个名为employeesaudit的新表,用来保存employees表中数据的更改:
CREATETABLEemployees_audit( idINTAUTO_INCREMENTPRIMARYKEY, employeeNumberINTNOTNULL, lastnameVARCHAR(50)NOTNULL, changedatDATETIMEDEFAULTNULL, actionVARCHAR(50)DEFAULTNULL );
再来创建一个BEFOREUPDATE触发器,该触发器在对employees表中的行记录更改之前被调用:
DELIMITER$$ CREATETRIGGERbefore_employee_update BEFOREUPDATEONemployees FOREACHROW BEGIN INSERTINTOemployees_audit SETaction='update', employeeNumber=OLD.employeeNumber, lastname=OLD.lastname, changedat=NOW(); END$$ DELIMITER;
在上述触发器的主体中,我们使用OLD关键字来访问受触发器影响的行的employeeNumber和lastname列。我们要注意的是,在为insert定义的触发器中,可以仅使用NEW关键字。不能使用OLD关键字。但是,在为DELETE定义的触发器中,没有新行,因此您只能使用OLD关键字。在update触发器中,OLD是指更新前的行,而NEW是更新后的行。
然后,我们可以使用SHOWTRIGGERS语句,来查看数据库中的触发器:
mysql>SHOWTRIGGERS; +------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+ |Trigger|Event|Table|Statement|Timing|Created|sql_mode|Definer|character_set_client|collation_connection|DatabaseCollation| +------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+ |before_employee_update|UPDATE|employees|BEGIN INSERTINTOemployees_audit SETaction='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表以检查触发器是否被调用:
UPDATEemployees SET lastName='Maxsu' WHERE employeeNumber=1056;
可以使用以下查询来查询employees_audit表,用以检查触发器是否被UPDATE语句调用:
mysql>SELECT*FROMemployees_audit; +----+----------------+----------+---------------------+--------+ |id|employeeNumber|lastname|changedat|action| +----+----------------+----------+---------------------+--------+ |1|1056|Hill|2017-08-0222:15:51|update| +----+----------------+----------+---------------------+--------+ 1rowinset
如上面输出结果所示,触发器被真正调用,并在employees_audit表中插入一个新行。
好啦,本次记录就到这里了。
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》
希望本文所述对大家MySQL数据库计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。