zoukankan      html  css  js  c++  java
  • MySQL触发器了解一下

    简介

    触发器是与表有关的数据库对象,当表发生INSERT/UPDATE/DELETE操作时,对应操作的触发器会被触发,将在这些操作之前或之后执行触发器中定义的SQL语句集合。

    触发器的使用

    创建触发器

    语法:

    CREATE
        [DEFINER = user]
        TRIGGER trigger_name
        trigger_time trigger_event
        ON tbl_name FOR EACH ROW
        [trigger_order]
        trigger_body
    

    user:指定在触发器激活时检查访问权限时要使用的MySQL帐户。

    trigger_name:触发器名称。

    trigger_time:触发动作时间。可以是BEFORE或AFTER,表示触发器在要修改的每一行之前或之后激活。

    trigger_event:触发器的类型,可以是INSERT、UPDATE、DELETE。

    tbl_name:和触发器关联的表名,必须为一个永久表,不能是视图或者临时表。

    trigger_order:指定触发器顺序,取值为FOLLOWS/PRECEDES+触发器名称。(从MySQL 5.7.2开始,可以为表创建具有相同trigger_time和trigger_event的多个触发器,默认顺序是按创建顺序进行激活)

    trigger_body:触发器激活时要执行的语句。如果要执行多个语句,需要使用BEGIN ... END复合语句包裹。

    示例:

    CREATE TRIGGER student_add2 AFTER INSERT ON tb_student 
    FOR EACH ROW 
    INSERT INTO tb_new_student (student_id, student_name) VALUES (NEW.id, NEW. NAME);
    

    当在MySQL命令行创建执行多个语句的触发器时,同存储过程一样,也需要修改语句分隔符,如下:

    mysql> delimiter //
    mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
           FOR EACH ROW
           BEGIN
               IF NEW.amount < 0 THEN
                   SET NEW.amount = 0;
               ELSEIF NEW.amount > 100 THEN
                   SET NEW.amount = 100;
               END IF;
           END;//
    mysql> delimiter ;
    
    触发器类型

    触发器分为三种类型:INSERT、DELETE、UPDATE。

    在触发器主体中,使用OLD和NEW关键字能够访问受触发器影响的行中的列,根据触发器类型的不同,在关键字使用上也有些区别。(OLD和NEW是对MySQL触发器的扩展,它们不区分大小写)

    INSERT触发器:当在表中插入新行时,触发器就会激活。插入操作只有新行,所以只有NEW关键字可用,可以通过NEW访问插入的新行数据。

    DELETE触发器:当在表中删除一行时,触发器就会激活。删除操作只有旧行,所以只有OLD关键字可用,可以通过OLD访问删除的旧行数据。

    UPDATE触发器:当表中一行数据被修改时,触发器就会激活。NEW关键字和OLD关键字都可用,可以通过NEW访问更新后的行数据,通过OLD访问更新前的行数据。

    查看触发器定义

    语法:

    SHOW CREATE TRIGGER trigger_name
    

    示例:

    mysql> SHOW CREATE TRIGGER student_add;
    +-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
    | Trigger     | sql_mode                                                       | SQL Original Statement                                                                                                                                                         | character_set_client | collation_connection | Database Collation |
    +-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
    | student_add | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` TRIGGER student_add AFTER INSERT ON tb_student FOR EACH ROW INSERT INTO tb_new_student (student_id, student_name) VALUES (NEW.id, NEW. NAME) | utf8                 | utf8_general_ci      | utf8_general_ci    |
    +-------------+----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
    

    Trigger:触发器名称。

    sql_mode:当触发器执行时,SQL模式生效。

    SQL Original Statement:触发器的创建语句。

    character_set_client:创建触发器时character_set_client系统变量的会话值。

    collation_connection:创建触发器时collation_connection系统变量的会话值。

    Database Collation:与触发器相关联的数据库的排序。

    删除触发器

    语法:

    DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
    

    示例:

    mysql> DROP TRIGGER student_add;
    Query OK, 0 rows affected
    

    注意:如果表被删除,该表的关联的所有触发器也将会被删除

    参考:Using Triggers

  • 相关阅读:
    sql server 2008 评估期已过期解决办法 + vs2008破解(转) 狼人:
    发现godaddy亚太机房主机比较慢,怎样转到godaddy美国机房 狼人:
    模拟提交有文件上传的表单(通过http模拟上传文件) 狼人:
    WordPress 批量关闭和打开评论功能 狼人:
    英文seo外链资源整合,怎么样找国外博客资源? 狼人:
    WindowsServer2003+IIS6+ASP+NET+PHP+MSSQL+MYSQL配置说明 |备份于waw.cnblogs.com 狼人:
    Excel表格的35招必学秘技(学会计的快来转载,留着以后用) 狼人:
    MSN去窗口广告方法http://apatch.org/downloads/ 狼人:
    js 实现谷歌浏览器中隐藏标签后setInterval事件暂停 狼人:
    SQL Server 2008过期导致MSSQLSERVER服务无法启动 狼人:
  • 原文地址:https://www.cnblogs.com/seve/p/14644124.html
Copyright © 2011-2022 走看看