MySQL触发器

触发器:触发器是MySQL响应DELETE、INSERT、UPDATE任意语句而自动执行的一条MySQL语句,其通常位于BEGIN和END语句之间的一组语句。

一、创建触发器

  在创建触发器时,需要给出以下4条信息:
  1.唯一的触发器名;
  2.触发器关联的表;
  3.触发器应该响应的活动(DELETE、INSERT或UPDATE);
  4.触发器何时执行(AFTER或BEFORE)。

  触发器是用CREATE TRIGGER语句来创建的,下面为一个简单的例子:

CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT 'Product added';

  该例子中通过CREATE TRIGGER语句创建名为newproduct的触发器,其作用是打印Product added。AFTER表示此触发器在INSERT执行成功后执行。这个触发器还指定FOR EACH ROW,即在插入每一行时都会执行此触发器。

二、删除触发器

  DROP TRIGGER语句用于删除一个触发器,如下所示:

DROP TRIGGER newproduct;

注意:触发器不能更新或覆盖,为了修改一个触发器,必须先删除它,然后再重新创建。

三、INSERT触发器

  INSERT触发器可以在INSERT之前或之后执行,需要注意一下几点:
  1.在INSERT触发器代码内,可以引用一个名为NEW的虚拟表,访问被插入的行;
  2.在BEFORE INSERT触发器中,NEW中的值也可以被更新(运行更改被插入的值);
  3.对于AUTO_INCREMENT列,NEW在INSERT之前为0,在INSERT之后为新的自动生成值。

下面为INSERT触发器的一个例子:

CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW
INSERT INTO orders_bak(order_num, order_date, cust_id)
VALUES(NEW.order_num, NEW.order_date, NEW.cust_id);

  该触发器在INSERT插入一行数据之后,将新插入的cust_id插入到orders_bak表中。下面对该触发器进行验证:

INSERT INTO orders(order_date, cust_id)
VALUES(NOW(), 10002);

然后使用下面指令来查看表orders_bak的内容:

SELECT * 
FROM orders_bak;

执行结果:
这里写图片描述

四、DELETE触发器

  DELETE触发器在DELETE语句执行之前或之后执行,需要注意以下两点:
  1.在DELETE代码中可以引用一个OLD的虚拟表,访问被删除的行;
  2.OLD中的值全部是只读的,不能更新。

下面例子演示使用OLD保存将要被删除的行到一个存档中:

CREATE TRIGGER deleteorder 
BEFORE DELETE ON orders
FOR EACH ROW 
INSERT INTO archive_orders(order_num, order_date, cust_id)
VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);

下面删除刚才插入的那行数据:

DELETE FROM orders
WHERE cust_id = 10002;

再使用下面指令查看表archive_orders的内容:

SELECT * 
FROM archive_orders;

执行结果:
这里写图片描述

五、UPDATE触发器

  UPDATE触发器在UPDATE语句之前或之后执行,需要注意一下几点:
  1.在UPDATE触发器代码中可以引用一个OLD的虚拟表访问更新前的数据,引用NEW的虚拟表访问更新后的值;
  2.在BEFORE UPDATE触发器中,NEW中的值可能也被更新;
  3.OLD中的值全部都是只读的。

下面例子保证州名缩写总是大写:

CREATE TRIGGER updatevendor
BEFORE UPDATE ON vendors
FOR EACH ROW
SET NEW.vend_state = UPPER(NEW.vend_state);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL 触发器是一个与表相关联的数据库对象,它在特定的INSERT、UPDATE或DELETE语句执行自动执行MySQL 触发器可以用于实现一些复杂的业务逻辑,比如在插入或更新数据时自动计算某些值、限制特定操作的执行等。 MySQL 触发器分为三种类型:BEFORE、AFTER和INSTEAD OF。BEFORE触发器执行INSERT、UPDATE或DELETE语句之前执行,可以用于验证数据的合法性、修改数据等;AFTER触发器执行INSERT、UPDATE或DELETE语句之后执行,可以用于记录日志、更新相关数据等;INSTEAD OF 触发器可以在执行INSERT、UPDATE或DELETE语句时替换原始的操作,可以用于实现自定义的数据更新逻辑。 MySQL 触发器的语法如下: ```sql CREATE TRIGGER trigger_name BEFORE|AFTER|INSTEAD OF INSERT|UPDATE|DELETE ON table_name FOR EACH ROW BEGIN -- 触发器执行的 SQL 语句 END; ``` 其中,`trigger_name` 是触发器的名称,`BEFORE|AFTER|INSTEAD OF` 指定触发器的类型,`INSERT|UPDATE|DELETE` 指定触发器要监听的操作类型,`table_name` 是要监听的表名,`FOR EACH ROW` 表示对表中每一行数据都执行触发器逻辑,`BEGIN` 和 `END` 之间是触发器执行的 SQL 语句。 例如,下面的代码创建了一个在 `users` 表上监听 INSERT 操作的 BEFORE 触发器,用于自动给 `created_at` 字段赋值当前时间戳: ```sql CREATE TRIGGER users_created_at BEFORE INSERT ON users FOR EACH ROW BEGIN SET NEW.created_at = NOW(); END; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值