zoukankan      html  css  js  c++  java
  • 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)

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    关于xampp 集成开发包电脑重启mysql无法启动的问题
    ThinkPhP html原样入库
    java 获取图片大小(尺寸)
    xampps 不能配置非安装目录虚拟主机解决方案
    从0开始 java 网站开发(jsp)【1】
    Hello world!
    SpringMVC归纳-1(model数据模型与重定向传参技术)
    TTL与非门电路分析
    git入门手册:git的基本安装,本地库管理,远程上传
    实现简单的评论区功能
  • 原文地址:https://www.cnblogs.com/featherwit/p/13437002.html
Copyright © 2011-2022 走看看