Loading

MySQL基础之使用触发器

触发器

触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句)

  • DELETE

  • INSERT

  • UPDATE

其他MySQL语句不支持触发器

 

创建触发器

在创建触发器时, 需要给出4条信息

  • 唯一的触发器名

  • 触发器关联的表

  • 触发器应该响应的活动(DELETE、INSERT或UPDATE)

  • 触发器何时执行(处理之前或之后)

触发器名必须在每个表中唯一, 但不是在每个数据库中唯一。这表示同一数据库中的两个表可具有相同的名字的触发器

触发器用CREATE TRIGGER语句创建

MariaDB [crashcourse]> CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'

此触发器将在INSERT语句成功执行后执行。这个触发器还指定FOR EACH ROW, 因此代码对每个插入行执行。在这个例子中, 文本Product added将对每个插入的行显示一次。

只有表才支持触发器, 视图不支持(临时表也不支持)

触发器按每个表每个事件每次的定义, 每个表每个事件每次只允许一个触发器。因此, 每个表最多只支持6个触发器(每条INSERT、UPDATE、DELETE之前和之后)。单一触发器不能与多个事件或多个表关联。

 

删除触发器

为了删除触发器, 可以使用DROP TRIGGER语句

MariaDB [crashcourse]> DROP TRIGGER newproduct;

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

 

使用触发器

INSERT触发器

INSERT触发器在INSERT语句执行之前或执行之后执行。

  • 在INSERT触发器代码内, 可引用一个名为NEW的虚拟表, 访问被插入的行
  • 在BEFORE INSERT触发器中, NEW中的值也可以被更新(允许更改插入的值)
  • 对于AUTO_INCREMENT列, NEW在INSERT执行之前包含0, 在INSERT执行之后包含新的自动生成的值
MariaDB [crashcourse]> CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;

DELETE触发器

DELETE触发器在DELETE语句执行之前或之后执行。

  • 在DELETE触发器代码中, 可以引用一个名为OLD的虚拟表, 访问被删除的行
  • OLD中的值全都是只读的, 不能更新
MariaDB [crashcourse]> CREATE TRIGGER deleteorder BEFORE DELETE ON order FOR EACH ROW BEGIN INSERT INTO archive_orders(order_num, order_date, cust_id) VALUES(OLD.order_num, OLD.order_date, OLD.cust_id) END;

使用BEFORE DELETE触发器的优点(相当于AFTER DELETE)在于, 如果由于某种原因, 订单不能存档, DELETE本身将被放弃

UPDATE触发器

UPDATE触发器在UPDATE语句执行之前或之后执行

  • 在UPDATE触发器中, 可以引用一个名为OLD的虚拟表访问以前(UPDATE之前)的值, 引用一个名为NEW的虚拟表访问新更新的值
  • 在BEFORE UPDATE触发器中, NEW中的值可能也被更新(允许更改将要用与UPDATE语句中的值)
  • OLD中的值全都是只读的, 不能更新
MariaDB [crashcourse]> CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state=Upper(NEW.vend_state)

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-08-04 23:16  愚者丶  阅读(252)  评论(0编辑  收藏  举报