zoukankan      html  css  js  c++  java
  • 触发器--mysql

    SHOW TRIGGERS;查看所有触发器

    create trigger tg1

    after insert on user

    for each row
    begin
    update user set name='test' where id=1;
    end

    insert into user(name,pass) values('shao','23')$$

    CREATE TRIGGER语法

    CREATE TRIGGER trigger_name trigger_time trigger_event
       ON tbl_name FOR EACH ROW trigger_stmt

    触发程序与命名为tbl_name的表相关。

    trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

    trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

    trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

    ·         INSERT:将新行插入表时激活触发程序

    ·         UPDATE:更改某一行时激活触发程序

    ·         DELETE:从表中删除某一行时激活触发程序

    trigger_stmt是当触发程序激活时执行的语句。如果你打算执行多个语句,可使用BEGIN 
    ... END复合语句结构。

    MySQL数据库创建触发器的格式如下:

    create trigger <触发器名称>
    { before | after}
    {insert | update | delete}
    on <表名>
    for each row
    <触发器SQL语句>


    create trigger <触发器名称>:创建一个新触发器,并指定触发器的名称。
    { before | after}:用于指定在insert、update或delete语句执行前触发还是在语句执行后触发。
    on <表名>:用于指定响应该触发器的表名。
    for each row:触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
    <触发器SQL语句>:触发器要执行的SQL语句,如果该触发器要执行多 条SQL语句,要将多条语句放在begin…end块中。

    实例:
    (1): 在“命令提示符”下创建数据表test1
    CREATE TABLE `test1` (                                  
    `id` int(11) NOT NULL AUTO_INCREMENT,                 
    `name` varchar(20) NOT NULL                                
    )
    (2): 再创建数据表test2
    CREATE TABLE `test2` (                                           
    `num` int(11) DEFAULT NULL,                            
    )
    (3):创建触发器
    create trigger `num` BEFORE INSERT on `test1`
    for each row update test2 set num = num + 1;
    向test1表插入数据,test2表中的num就加一
    (4): INSERT INTO test1 (name) VALUES ('aa');
    (5):查看test1和test2表中的数据

    DROP TRIGGER语法

    DROP TRIGGER [schema_name.]trigger_name

    舍弃触发程序。方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。

    DROP TRIGGER test.num

    注意:

    使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。

    用OLD命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。

    在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生成的序列号。


    insert into usem(id,name,pass) values(2,'shao','23')


    create trigger tab1
    after insert on usem ----->不能对表进行SQL操作
    for each row
    begin
    insert into user(name,pass)values('shao','chuan');--->不能有多余的空格键
    end

  • 相关阅读:
    《C++反汇编与逆向分析技术揭秘》--构造函数 读书笔记
    《C++反汇编与逆向分析技术揭秘》--虚函数 读书笔记
    VPP-main() 源码学习
    【转】几种TCP连接中出现RST的情况
    动态追踪学习
    RCU学习总结
    内核栈回溯原理学习应用
    《C++反汇编与逆向分析技术揭秘》--单类继承 读书笔记
    C# 防火墙操作之创建规则
    C# 防火墙操作之特定程序
  • 原文地址:https://www.cnblogs.com/AutumnRhyme/p/5602089.html
Copyright © 2011-2022 走看看