您的位置:68399皇家赌场 > 虚拟主机 > mysql 触发器(trigger),mysqltrigger

mysql 触发器(trigger),mysqltrigger

发布时间:2019-05-07 09:29编辑:虚拟主机浏览(178)

    触发器用来完结在永恒表上进行一些操作时接触运转另1操作。

    mysql 触发器(trigger),mysqltrigger

    触发器(trigger):监视某种情况,并触及某种操作。

    触发器创制语法4要素:一.蹲点地方(table) 二.蹲点事件(insert/update/delete) 3.接触时间(after/before) 四.触发事件

    语法:

    CREATE TRIGGER trigger_name trigger_time trigger_event
        ON tbl_name FOR EACH ROW trigger_stmt
    

    接触程序与命名字为tbl_name的表相关。tbl_name必须引用长久性表。不可能将触发程序与一时半刻表表或视图关联起来。

    trigger_time是触发程序的动作时间。它能够是before或after,以指明触发程序是在激活它的言辞从前或之后触发。

    trigger_event指明了激活触发程序的话语的项目。trigger_event能够是下述值之一:

       insert :将新行插入表时激活触发程序,举个例子,通过insert、load data和replace语句。

      update:退换某一行时激活触发程序,举例,通过update语句。

         delete :从表中删除某一行时激活触发程序,举个例子,通过delete和replace语句。

    要注意,trigger_event与以表操作方法激活触发程序的SQL语句并不很相近,这一点很重大。

    诸如:关于insert的before触发程序不唯有能被insert语句激活,也能被load data语句激活。

    create trigger triggerName

    after/before insert/update/delete on 表名

    for each row   #那句话在mysql是一向的

    begin

    sql语句;

    end;


     

    对于insert言辞, 只有new是法定的;

    对于delete语句,只有old才合法;

    对于update讲话,new、old能够同时利用。


     

    创设表(触发器要操作的两张表)

    /*auto_increment:自增;priamry key :主键;comment:注释*/

    澳门皇家赌场55533网址,/* drop:删除;if exists xxx(剖断xxx名在数据库时候是或不是出存在xxx名称)*/

    /* for each row :循环一行一行的试行数据 */

    /* after insert/update/delete on table_name :针对哪个表实行的insert/update/delete 操作 */

    drop table if exists table1;
    
    create table table1(
    id int(4) primary key auto_increment not null comment 'id',
    name varchar(225) comment '名字'
    );
    
    drop table if exists table2;
    create table table2(
    id int primary key auto_increment not null comment 'id',
    name varchar(225) comment '名字'
    );
    

    Before与After区别:

    before:(insert、update)可以对new举行改换,after不能够对new实行改换,两者都无法修改old数据。

    insert 触发器

    drop trigger if exists insert_on_table1;
    create trigger insert_on_table1
    after insert  on table1
    for each row
    begin
    insert into table2(name) value(new.name);
    end
    

    操作触发器

    insert table1(name) value('aaa');
    

    查询table二是还是不是有值

    select * from table2;
    

    delete触发器

    drop trigger if exists delete_on_table1;
    create trigger delete_on_table1
    after delete on table1
    for each ROW
    begin
    delete from table2 where name=old.name;
    end
    

    实行删除操作

    delete from table1 where id=1;
    

    查询table2变化

    select * from table2;
    

    立异table壹更新触发器

    drop trigger if exists update_on_table1;
    create trigger update_on_table1
    after update on table1
    for each ROW
    begin
    update table2 set name=new.name where name=old.name;
    end
    

    进行更新操作

    update table1 set name='ccc';
    

    查询table2变化

    select * from table2;
    

     使用before 总计插入积分例子:

    创建表

    drop table if exists table3;
    create table table3(
    id int primary key auto_increment comment 'id',
    num int  comment '积分'
    )engine=myisam  default charset=utf8 comment='单独积分表';
    

    创建用函数变量接收的触发器

    drop trigger if exists insert_on_table3;
    create trigger insert_on_table3
    before insert on table3
    for each row 
    set @sum=@sum new.num;
    

    实施触发器

    set @sum=0;
    insert into table3 values(1,2),(2,3),(3,3),(4,3);
    select @sum;
    

     

    触发器(trigger),mysqltrigger 触发器(trigger):监视某种意况,并触及某种操作。 触发器创制语法四要素:一.蹲点地点(table)2.蹲点事件(inse...

    语法

    MySQL触发器

    触发器(trigger):监视某种情状,并触及某种操作。

    触发器创造语法4要素:一.监视地方(table) 二.蹲点事件(insert/update/delete) 3.触及时间(after/before) 四.触发事件(insert/update/delete)

     

    ~~语法~~
    

    CREATE T卡宴IGGE昂Cora <触发器名称> --触发器必须有名字,最多陆12个字符,可能前边会附有分隔符.它和MySQL中其余对象的命名格局为主相象.
    { BEFORE | AFTER } --触发器有实行的时辰设置:可以设置为事件产生前或后。
    { INSERT | UPDATE | DELETE } --同样也能设定触发的风云:它们得以在实施insert、update或delete的经过中触发。
    ON <表名称> --触发器是属于某一个表的:当在那个表上进行插入、 更新或删除操作的时候就形成触发器的激活. 大家无法给同样张表的同四个风浪安插四个触发器。
    FOR EACH ROW --触发器的执行间隔:FO福特Explorer EACH ROW子句布告触发器 每隔一行实施壹次动作,而不是对任何表实行3回。
    <触发器SQL语句> --触发器包括所要触发的SQL语句:这里的讲话能够是其余官方的话语, 包罗复合语句,可是这里的语句受的限量和函数的同等。

     

    create trigger triggerName

    after/before insert/update/delete on 表名

    for each row #那句话在mysql是恒久的

    begin

    sql语句;

    end;

    注:各自颜色对应上面的四要素。

    率先我们来成立两张表:

    #商品表

    create table g

    (

      id int primary key auto_increment,

      name varchar(20),

      num int

    );

    #订单表

    create table o

    (

      oid int primary key auto_increment,

      gid int,

    much int

    );

    insert into g(name,num) values('商品1',10),('商品2',10),('商品3',10);

     

    要是我们在没动用触发器此前:即使我们后日卖了一个商品1,大家供给做两件事

    一.往订单表插入一条记下

    insert into o(gid,much) values(1,3);

    二.立异商品表商品一的盈余数量

    update g set num=num-3 where id=1;

     

    近期,咱们来创设叁个触发器:

    亟待先进行该语句:delimiter $(意思是报告mysql语句的最后换到以$停止)

    create trigger tg1
    after insert on o
    for each row
    begin
    update g set num=num-3 where id=1;
    end$

    那时候大家假诺进行:

    insert into o(gid,much) values(1,3)$

    会开掘商品一的数据改为7了,表明在我们插入一条订单的时候,触发器自动帮我们做了翻新操作。

     

    但现行反革命会有3个标题,因为大家触发器里面num和id都是写死的,所以无论大家买哪些商品,最终更新的都以物品1的数额。比方:我们往订单表再插入一条记下:insert into o(gid,much) values(二,3),实践完后会发觉货色一的多寡变四了,而商品二的数据没变,那样显著不是大家想要的结果。大家必要修改大家前面成立的触发器。

    咱俩怎么在触发器引用行的值,也正是说大家要拿走大家新插入的订单记录中的gid或much的值。

    对此insert来说,新插入的行用new来表示,行中的每1列的值用new.列名来代表。

    故此以往我们得以这么来改大家的触发器

    create trigger tg2
    after insert on o
    for each row
    begin
    update g set num=num-new.much where id=new.gid;(注意此处和第二个触发器的不及)
    end$

    其次个触发器成立完结,我们先把第一个触发器删掉

    drop trigger tg1$

    再来测试一下,插入一条订单记录:insert into o(gid,much) values(二,三)$

    实践完发掘商品二的数据改为⑦了,未来就对了。

     

    近期还留存二种情景:

    1.当用户撤废一个订单的时候,大家那边一直删除1个订单,大家是还是不是索要把相应的货品数量再加回去呢?

    2.当用户修改1个订单的多少时,大家触发器修改怎么写?

    我们先分析一下首先种状态:

    监视地方:o表

    监视事件:delete

    接触时间:after

    接触事件:update

    对于delete而言:原本有一行,后来被删去,想引用被删去的那1行,用old来表示,old.列名能够引用被剔除的行的值。

    那我们的触发器就该那样写:

    create trigger tg3

    after delete on o

    for each row

    begin

    update g set num = num old.much where id = old.gid;(注意那边的改造)

    end$

    始建实现。

    再执行delete from o where oid = 2$

    会发觉商品二的数目又改成10了。

     

    第两种情状:

    监视地点:o表

    监视事件:update

    接触时间:after

    接触事件:update

    对于update来讲:被修改的行,修改前的数量,用old来代表,old.列名引用被涂改从前行中的值;

    修改的后的多少,用new来代表,new.列名引用被修改现在行中的值。

    那我们的触发器就该如此写:

    create trigger tg4

    after update on o

    for each row

    begin

    update g set num = num old.much-new.much where id = old/new.gid;

    end$

    先把旧的数额复苏再减去新的多少正是修改后的多少了。

    我们来测试下:先把商品表和订单表的数量都清掉,易于测试。

    要是大家往商品表插入多个商品,数量都是十,

    买3个商品1:insert into o(gid,much) values(1,3)$

    此刻商品一的数据改为柒;

    我们再修改插入的订单记录: update o set much = 5 where oid = 一$

    小编们成为买五个商品壹,那时候再查询商品表就能够意识商品一的数目只剩五了,表达大家的触发器发挥成效了。

     

    要是:假使商品表有商品一,数量是10;

    我们往订单表插入一条记下:

    insert into o(gid,much) values(1,20);

    会开掘货品一的多少改为-十了。那正是难题的中国人民解放军第陆野战军,因为咱们事先创设的触发器是after,也正是说触发的言语是在插入订单记录之后才施行的,那样大家就不可能判断新插入订单的选购数码。

     

    先讲一下after和before的分别:

    after是先成功多少的增删改,再接触,触发的说话晚于监视的增加和删除改操作,不能够影响后边的增加和删除改换作;也正是说先插入订单记录,再立异商品的多寡;

    before是先成功触发,再增加和删除改,触发的说话先于监视的增加和删除改,大家就有机遇判定,修改就要爆发的操作;

     

    大家用1个规范案例来差别它们的分别,新建三个触发器:

    #监视地方: 商品表o

    #监视事件:insert

    #接触时间:before

    #接触事件:update

    案例:当新扩张一条订单记录时,决断订单的商品数量,如若数额超越10,就暗中同意改为十

    create trigger tg6

    before insert on o

    for each row

    begin

      if new.much > 10 then

        set new.much = 10;

      end if;

      update g set num = num - new.much where id = new.gid;

    end$

    施行完,把前面创设的after触发器删掉,再来插入一条订单记录:

    insert into o(gid,much) valus(1,20)$

    执行完会开掘订单记录的多寡改为10,商品一的数据变为0了,就不会油然则生负数了。

     

    触发器(trigger):监视某种意况,并触及某种操作。 触发器制造语法四要素:一.蹲点地方(table) 贰.监视事件(insert/update/delete) 三.触发...

    一.创制触发器

    以下是MariaDB中create trigger的语法:mysql不支持or replace和if not exists子句。

    CREATE [OR REPLACE] TRIGGER [IF NOT EXISTS] trigger_name
        { BEFORE | AFTER } { INSERT | UPDATE | DELETE }
        ON tbl_name FOR EACH ROW
        trigger_body
    

    触发器只能创造在永世表上,无法创立在视图和一时半刻表上。MySQL/玛丽亚DB中的触发器只协理行级触发器(即每行都触发1遍触发器),不援救数据库等级和服务器级其余触发器。MySQL/玛丽亚DB中的触发器纵然都是基于表的,却蕴藏在数据库下,领悟这点很重大,未来翻看、删除、引用trigger的时候都以经过数据库名称来引用的,而不是利用表来引用。

    before和after是触发时间,insert/update/delete是接触事件。例如before insert代表插入记录在此以前接触程序。个中before触发器类似于SQL Server中的instead of触发器,效率在自己商量约束在此以前。而after触发器和SQL Server中1致,在检讨约束之后才生效。

    下图为SQL Server中instead of和after触发器的行事岗位。在MySQL/玛丽亚DB中是大同小异的,只要把MySQL/MariaDB中的概念和SQL Server中的概念对应起来就能够。后文中有对该图的分析。

    澳门皇家赌场55533网址 1

    在MySQL中,一张表只可以有三个同时间、同事件的触发器,所以MySQL中不补助基于列的触发器。比如,一张表中得以存在before insert触发器和before update,所以每张表最三只可以有几个触发器。可是玛丽亚DB 拾.2.叁中得感觉同时间、同事件创设八个触发器。

    在MySQL/MariaDB中,使用old和new表独家表示触发器激活后的新旧表,在SQL Server中行使的是inserted和deleted表,其实它们的意义是等价的。不过坑爹的是MySQL/玛丽亚DB中不得不引用那两张表中的列,而望尘不及直接引用那两张表。举个例子能够引用old.col_name,可是不能一直select * from old这么引用old表。

    old表表示删除目的志录之后将去除的笔录保留在old表中,即deleted表。new表表示向表中插入新记录以前,新记录保存在new表中,即inserted表。或许说,只要涉及了insert相关的操作就有new表,只要提到了delete相关的操作就有old表,而update操作基本可以认为是先delete再insert的作为,所以也会触发那两张表。

    瞩目,固然是after触发器,也是先将数据填充到old、new表中,再施行DML语句,最终激活触发器试行触发器中的语句。

    在上面包车型客车小节中会分别证实区别事件不一致时间的触发器行为。在注脚它们在此以前,先创设示范数据。

    CREATE DATABASE IF NOT EXISTS test ;
    
    USE test ;
    
    CREATE OR REPLACE TABLE emp (
        emp_no INT (11) NOT NULL,
        mgr_no INT (11) DEFAULT NULL,
        emp_name VARCHAR (30) DEFAULT NULL,
        PRIMARY KEY (emp_no)
    ) 
    INSERT INTO emp (emp_no, mgr_no, emp_name) VALUES
        (1, NULL, 'David'),
        (2, 3, 'Mariah'),
        (3, 1, 'Tommy'),
        (4, 1, 'Jim'),
        (5, 3, 'Selina'),
        (6, 4, 'John'),
        (8, 3, 'Monty');
    

    翻开该表数据。

    澳门皇家赌场55533网址 2

    再创造三个Infiniti简约的稽核表audit,该表前两列为自增列和注释列,前面包车型大巴列结构同样emp表。

    DROP TABLE IF EXISTS  audit;
    CREATE TABLE audit AS SELECT * FROM emp WHERE 1=0;
    ALTER TABLE audit ADD id INT AUTO_INCREMENT PRIMARY KEY FIRST;
    ALTER TABLE audit ADD note CHAR(50) AFTER id;
    

    CREATE TPAJEROIGGE汉兰达 <触发器名称>  --触发器必须盛名字,最多6二十一个字符,恐怕前面会附有分隔符.它和MySQL中其余对象的命名情势为主相象.
    { BEFORE | AFTE帕杰罗 }  --触发器有试行的光阴设置:能够设置为事件产生前或后。
    { INSERT | UPDATE | DELETE }  --同样也能设定触发的风浪:它们能够在实践insert、update或delete的历程中触发。
    ON <表名称>  --触发器是属于某三个表的:当在那些表上实行插入、 更新或删除操作的时候就变成触发器的激活. 我们无法给同样张表的同1个风云布署四个触发器。
    FO昂科拉 EACH ROW  --触发器的进行间隔:FO陆风X八 EACH ROW子句布告触发器 每隔1行实践一回动作,而不是对任何表施行一遍。
    <触发器SQL语句>  --触发器包蕴所要触发的SQL语句:这里的语句能够是其他合法的语句, 包罗复合语句,但是此地的语句受的范围和函数的平等。

    2.insert触发器

    insert触发器的职能是:当向表中插入数据的时候,将会激活触发器。有两类:before和after触发器,分别代表数据插入到表中从前和数量插入到表中之后激活触发器。

    在意,只要向表中插入了新行,就能激活insert触发器。插入新行的动作不唯有唯有insert语句,还有别的插入操作,举个例子load data语句、replace语句等等。

    # 创建before insert触发器
    DELIMITER $$
    CREATE OR REPLACE TRIGGER test.trig_demo1 
        BEFORE INSERT ON test.emp FOR EACH ROW
        BEGIN
            INSERT INTO audit VALUES(null,'before insert',new.emp_no,new.mgr_no,new.emp_name);
        END$$
    DELIMITER ;
    
    # 创建after insert触发器
    DELIMITER $$
    CREATE OR REPLACE TRIGGER test.trig_demo2
        AFTER INSERT ON test.emp FOR EACH ROW
        BEGIN
            INSERT INTO audit VALUES(null,'after insert',new.emp_no,new.mgr_no,new.emp_name); 
        END$$
    DELIMITER ;
    

    before insert触发器的效能是:当向表emp中insert数据时,将首先激活该触发器,该触发器首先会将待插入数据填充到new表中,再向审查批准表audit中插入壹行数据,并注脚本次触发操作是"before insert"。触发器实践完成后,才起来向emp表中插入数据。

    after insert触发器的效益是:当向表emp中insert数据时,将先将数据填充到new表中,再插入到emp表,之后激活该触发器,该触发器会向审批表audit中插入1行数据,并标明本次触发操作是"after insert"。

    现行反革命向emp表中插入数据开始展览测试。

    INSERT INTO emp VALUES(10,3,'longshuai');
    

    安顿之后,查看audit表。

    MariaDB [test]> select * from audit;
     ---- --------------- -------- -------- ----------- 
    | id | note          | emp_no | mgr_no | emp_name  |
     ---- --------------- -------- -------- ----------- 
    |  1 | before insert |     10 |      3 | longshuai |
    |  2 | after insert  |     10 |      3 | longshuai |
     ---- --------------- -------- -------- ----------- 
    

    可以看看,三遍insert操作触发了before insert和after insert三个触发器。且不论before仍然after insert触发器都有new表的存在。

    在mariadb 10.二.3本子之后,三个表中可以为同近日间、同一事件成立八个触发器(在mysql中不容许)。比方:

    # 创建第二个after insert触发器
    DELIMITER $$
    CREATE OR REPLACE TRIGGER test.trig_demo3
        AFTER INSERT ON test.emp FOR EACH ROW
        BEGIN
            INSERT INTO audit VALUES(null,'after insert2',new.emp_no,new.mgr_no,new.emp_name); 
        END$$
    DELIMITER ;
    
    show triggers;
    

    澳门皇家赌场55533网址 3

    这里删除新建的这一个trigger,注意删除trigger的时候是通过数据库名称来也引用trigger的,而不是table名称。

    drop trigger test.trig_demo3;
    

    看名就能够猜到其意义,new是新插入的数量,old是本来的数量

    3.delete触发器

    delete触发器的效应是:当删除表中数据记录的时候,将会激活触发器。

    有两类insert触发器:before和after触发器,分别代表表中著录被删除从前和表中数据被删除之后激活触发器。

    留神,delete触发器只在表中著录被剔除的时候才会被激活。比方delete语句、replace语句。不过drop语句、truncate语句不会激活delete触发器,因为它们是DDL语句,而MySQL/玛丽亚DB不帮忙DDL触发器,它们并从未对表中的记录推行delete操作。

    # 创建before delete触发器
    DELIMITER $$
    CREATE OR REPLACE TRIGGER test.trig_demo3 
        BEFORE DELETE ON test.emp FOR EACH ROW 
        BEGIN
            INSERT INTO audit VALUES(NULL,'before delete',old.emp_no,old.mgr_no,old.emp_name); 
        END$$
    DELIMITER ;
    
    # 创建after delete触发器
    DELIMITER $$
    CREATE OR REPLACE TRIGGER test.trig_demo4
        AFTER DELETE ON test.emp FOR EACH ROW 
        BEGIN
            INSERT INTO audit VALUES(NULL,'after delete',old.emp_no,old.mgr_no,old.emp_name); 
        END$$
    DELIMITER ;
    

    那多个delete事件的触发器成效很简短,先将待删除的记录插入到old表中,再在剔除表中的笔录之前、之后,向审查批准表audit中插入1行'before delete'或'after delete'的甄别日志。

    方今去除emp表中的壹行记录实行测试。

    delete from emp where emp_no=10;
    

    删除emp表中多少以往,查看audit表。

    MariaDB [test]> SELECT * FROM audit;
     ---- --------------- -------- -------- ----------- 
    | id | note          | emp_no | mgr_no | emp_name  |
     ---- --------------- -------- -------- ----------- 
    |  1 | before insert |     10 |      3 | longshuai |
    |  2 | after insert  |     10 |      3 | longshuai |
    |  3 | before delete |      0 |   NULL | NULL      |
    |  4 | after delete  |      0 |   NULL | NULL      |
     ---- --------------- -------- -------- ----------- 
    

    可知,三回delete操作触发了before delete和after delete触发器。且删除记录前后old表都设有。

    insert只会有new,代表着要插入的新记录

    本文由68399皇家赌场发布于虚拟主机,转载请注明出处:mysql 触发器(trigger),mysqltrigger

    关键词: 68399皇家赌场

上一篇:mysql五.6搭建主从复制

下一篇:没有了