目录3. 查看和删除触发器4. 触发器的优点和缺点
前言
在实际开发中我们经常会遇到这样的情况:有两张或多张相互关联的表,比如商品信息和库存信息分别存储在两个不同的数据表中。当我们增加一条新的商品记录时,为了保证数据的完整性,还必须在库存表中添加一条库存记录。
这样的话,我们就必须把这两个相关的操作步骤写到程序中,并且用事务包装起来,保证这两个操作成为一个原子操作,要么全部执行,要么都不执行。
如果遇到特殊情况,可能需要手动维护数据,这样很容易忘记其中一个步骤,导致数据丢失。这时候我们就可以使用触发器了。
您可以创建一个触发器,让商品信息数据的插入自动触发库存数据的插入。这样,您就不必担心因忘记添加库存数据而导致数据丢失。
1. 触发器概述
MySQL 从 5.0.2 版本开始支持触发器。MySQL 触发器与存储过程一样,是嵌入在 MySQL 服务器中的程序。
触发器是触发某个操作的事件。这些事件包括、、和。事件是指用户的操作或者触发行为。如果定义了触发器,当数据库执行这些语句时,就相当于发生了一个事件,触发器会自动触发相应的操作。在数据表中插入、更新、删除数据时,需要自动执行一些数据库逻辑,可以使用触发器来实现。
2. 创建触发器 2.1 创建触发器语法
创建触发器的语法是:
CREATE TRIGGER 触发器名称 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 FOR EACH ROW 触发器执行的语句块;
阐明:
①表名:表示触发器监控的对象。
②|AFTER:表示触发时间。 表示在事件发生前触发; AFTER 表示在事件发生后触发。
③||:表示触发的事件。
表示插入一条记录;
表示更新记录;
表示删除一条记录。
④ 触发器执行的语句块:可以是单个SQL语句,也可以是由BEGIN…END结构组成的复合语句块。
2.2 代码示例
例子:
①创建数据表:
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) );
②创建触发器:创建一个名为的触发器,在向数据表插入数据之前,将日志信息插入到数据表中。
DELIMITER // CREATE TRIGGER before_insert BEFORE INSERT ON test_trigger FOR EACH ROW BEGIN INSERT INTO test_trigger_log (t_log) VALUES('before_insert'); END // DELIMITER ;
③向数据表中插入数据
INSER编程T INTO test_trigger (t_note) VALUES ('测试 BEFORE INSERT 触发器');
④查看数据表中的数据
mysql> SELECT * FROM test_trigger_log; +----+---------------+ | id | t_log | +----+---------------+ |android 1 | before_insert | +----+---------------+ 1 row in set (0.00 sec)
3.查看和删除触发器 3.1查看触发器
查看触发器就是查看数据库中已经存在的触发器的定义、状态、语法信息。
方法一:查看当前数据库中所有触发器的定义
SKmUVSlHOW TRIGGERS\G
方法二:查看当前数据库中触发器的定义
SHOW CREATE TRIGGER 触发器名
方法三:从系统库中的表中查询触发器信息
SELECT * FROM information_schema.TRIGGERS;
3.2 删除触发器
触发器也是数据库对象。要删除触发器,请使用 DROP 语句。语法如下:
DROP TRIGGER IF EXISTS 触发器名称;
4. 触发器的优缺点 4.1 优点
①触发器可以保证数据的完整性。
假设我们使用采购订单表头表(demo.)来保存采购订单的整体信息,包括采购订单号、供应商号、仓库号、采购总数量、采购总金额、验收日期。
使用采购订单明细表(demo.)保存采购商品的详细信息,包括采购订单号、产品编号、采购数量、采购价格、采购金额。
每当我们输入、删除或者修改一份采购订单明细数据时,采购订单明细表中的数据就会发生变化,此时就必须重新计算采购订单表头表中的总数量和总金额,否则采购订单表头表中的总数量和总金额将不等于采购订单明细表中的总数量。
计算量和金额是加在一起的,这是数据上的不一致。
为了解决这个问题,我们可以使用触发器,每当采购订单详情表有数据插入、修改或删除时,自动触发两个步骤:
1)重新计算采购订单明细表中的总数量、总金额;
2)使用第一步计算出的数值更新采购订单头表中的总数量和总金额。
这样,采购订单表头表中的总数量、总金额值就会一直与采购订单明细表中计算出的总数量、总金额值相同,数据一致,不会互相矛盾。
②触发器可以帮助我们记录操作日志。
触发器可以用来记录什么时间发生了什么事情,比如记录会员存款金额修改的触发器就是一个很好的例子,这对于我们还原操作执行时的具体场景,更好地定位问题原因非常有帮助。
③触发器还可以用于在操作数据之前检查数据的合法性。
例如超市采购商品时,仓库管理员需要录入采购价格,但人工操作容易出错,比如录入数量时,条码是扫进去的;录入金额时,输入的价格远高于销售价格,导致账面上出现巨额亏损,这些都可以在实际录入时通过触发器来解决
或者在更新操作之前,检查相应数据,并及时提示错误,防止错误的数据进入系统。
4.2 缺点
①触发器最大的问题是可读性差。
因为触发器是存放在数据库中的,并且是事件驱动的,这就意味着触发器可能不受应用层的控制,这对于系统维护来说非常有挑战性,比如创建一个触发器来修改会员存款操作,如果触发器中的操作出错,会员存款金额就会更新失败,我用的是
下面的代码演示了这一点:
mysql> update demo.membermaster set memberdeposit=20 where memberid = 2; ERROR 1054 (42S22): Unknown column 'aa' in 'field list'
结果显示系统提示错误,字段“aa”不存在。这是因为触发器中的数据插入操作多了一个字段,系统提示错误。但是如果你不了解这个触发器,你可能会认为更新语句本身有问题,或者会员信息表的结构有问题。你也可能会给出
我尝试通过在会员信息表中添加一个名为“aa”的字段来解决这个问题,但是却浪费精力。
②相关数据的变化可能造成触发误差。
尤其是数据表结构的变化可能会导致触发器出现错误,进而影响数据操作的正常运行,由于触发器本身的隐蔽性,会影响应用程序中排查错误原因的效率。
4.3 注意事项
注意,如果子表中定义了外键约束,且外键指定了ON//SET NULL子句,那么修改父表引用的键值或者删除父表引用的记录行也会引起对子表的修改、删除操作。
该语句定义的触发器将不会被激活。
MySQL触发器的使用和优缺点这篇文章就到此结束了,关于MySQL触发器的更多信息请搜索我们之前的文章或者继续浏览下面的相关文章,希望大家以后多多支持我们!
本文标题:MySQL触发器的使用及优缺点介绍
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。