广告
返回顶部
首页 > 资讯 > 数据库 >mysql中before和after的区别有哪些
  • 210
分享到

mysql中before和after的区别有哪些

2024-04-02 19:04:59 210人浏览 安东尼
摘要

这篇文章主要介绍了Mysql中before和after的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。触发器(trigger):监

这篇文章主要介绍了Mysql中before和after的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。

触发器经常用于加强数据的完整性约束和业务规则等。 触发器创建语法四要素:

1.监视地点(table)

2.监视事件(insert/update/delete)

3.触发时间(after/before)

4.触发事件(insert/update/delete)

其中:trigger_time是触发器的触发事件,可以为before(在检查约束前触发)或after(在检查约束后触发);trigger_event是触发器的触发事件,包括insert、update和delete,可以使用old和new来引用触发器中发生变化的记录内容。

需要注意的:

1)需注意对同一个表的相同触发时间(after/before)的相同触发事件(insert/update/delete),只能定义一个触发器,否则报错

ERROR 1235 (42000): This version of mysql doesn't yet support 'multiple triggers with the same action time and event for one table'

2)mysql触发器中的if判断语法格式如下:(1).循环中还可以有循环,(2).else后面没有then, (3).elseif!!!!不是else if !!

if...then{

if...then{}

end if;

if...then{}

end if;

...

}

elseif...then..

else

end if ;

注意可以使用两个if循环,各自end if即可

3)注意mysql触发器中的before和after的区别:

before:(insert、update)可以对new进行修改,

after:不能对new进行修改,两者都不能修改old数据。

对于INSERT语句, 只有NEW是合法的;

对于DELETE语句,只有OLD才合法;

对于UPDATE语句,NEW、OLD可以同时使用。

after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;

before是先完成触发,再增删改,触发的语句先于监视的增删改,这样就可以对new进行修改了;

摘自网络的一个例子说明:

首先我们来创建两张表:

#商品表

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);

我们借助触发器来完成下订单之后,自动对商品表中相应商品做减法;如下:

create trigger tg2

after insert on o

for each row

begin

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

end$

但是有个问题是,如果下订单数超过商品总数时,那么会导致商品表中产生负数,这样我们可以借助before来对订单中new值进行修改,保证商品表不会出现负数;

案例:当新增一条订单记录时,判断订单的商品数量,如果数量大于10,就默认改为10

DELIMITER $

create trigger tg6

beforeinsert 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 $

DELIMITER ;

4)不是说一个事务出发一次,如下这个事务修改了10行数,他会触发10次:

mysql> update blocks_infos set infos_id=1 where infos_id=2;

Query OK, 10 rows affected (0.22 sec)

Rows matched: 10  Changed: 10  Warnings: 0

5)针对before的情况,如果触发的操作没有成功,会导致原本的触发事件也不成功;

接下来记录下,我写的案例,当对一个表做增删改的时候,触发对另一表做相应的操作,

例如下面,如果begin后面有语法错误或者执行错误,那么会导致前面的delete失败;

DELIMITER $

create trigger tri_delete_blocks_infos1  before delete

on blocks_infos for each row

begin

DECLARE h int;

set h=(select intc   from   bidinfo.v_publish_info  where id=old.infos_id);

if h  is null  then

update bidinfo.v_publish_info set   intc=1    where id= old.infos_id;

else

update bidinfo.v_publish_info set   intc=intc+1    where id= old.infos_id;

end if;

end $

DELIMITER ;

1.关于insert的触发器:

我们的要求是当向blocks_infos的时候,先判断blocks_infos_opensearch表中有没有新insert的infos_id,如果有就相应的update,没有的话就insert,可以如下两种方法:

方法一使用replace:

DELIMITER $

create trigger tri_insert_blocks_infos  after insert

on blocks_infos for each row

begin

replace into  blocks_infos_opensearch (infos_id,blocks)  select infos_id,group_concat(blocks_id) blocks from blocks_infos  where infos_id=new.infos_id group by infos_id;

end $

DELIMITER ;

注意关于MySQL replace into 有三种形式(into关键字可以省略):

1. replace into tbl_name(col_name, ...) values(...)

2. replace into tbl_name(col_name, ...) select ...

3. replace into tbl_name set col_name=value, ...

方法二:用if判断:

DELIMITER $

create trigger tri_insert_blocks_infos  after insert

on blocks_infos for each row

begin

DECLARE c INT;

set c=(SELECT COUNT(infos_id) FROM blocks_infos  WHERE infos_id=new.infos_id);

if c=1 then

insert into  blocks_infos_opensearch  select infos_id,GROUP_CONCAT(blocks_id) blocks FROM blocks_infos  WHERE infos_id=new.infos_id;

elseif  c>1  then

UPDATE blocks_infos_opensearch SET blocks= (SELECT GROUP_CONCAT(blocks_id) blocks FROM blocks_infos  WHERE infos_id=new.infos_id ) WHERE infos_id= new.infos_id;

end if ;

end $

DELIMITER ;

2.关于delete的触发器:

DELIMITER $

CREATE TRIGGER tri_delete_blocks_infos  after DELETE

ON blocks_infos FOR EACH ROW

BEGIN

DECLARE c INT;

SET c=(SELECT COUNT(infos_id) FROM blocks_infos  WHERE infos_id=old.infos_id);

IF c=0  THEN

DELETE FROM  blocks_infos_opensearch   WHERE infos_id=old.infos_id;

ELSEIF  c>0  THEN

UPDATE blocks_infos_opensearch SET blocks= (SELECT GROUP_CONCAT(blocks_id) blocks FROM blocks_infos  WHERE infos_id=old.infos_id ) WHERE infos_id= old.infos_id;

END IF;

END $

DELIMITER ;

3.关于update的触发器:

DELIMITER $

CREATE TRIGGER tri_update_blocks_infos  after update

ON blocks_infos FOR EACH ROW

BEGIN

DECLARE c INT;

DECLARE d varchar(1000);

DECLARE  h varchar(1000);

SET c=(SELECT COUNT(infos_id) FROM blocks_infos  WHERE infos_id=old.infos_id);

set  d=(SELECT GROUP_CONCAT(blocks_id) blocks FROM blocks_infos  WHERE infos_id=old.infos_id);

set  h=(SELECT GROUP_CONCAT(blocks_id) blocks FROM blocks_infos  WHERE infos_id=new.infos_id);

IF c=0  THEN

DELETE FROM  blocks_infos_opensearch   WHERE infos_id=old.infos_id;

ELSEIF  c>0  THEN

UPDATE blocks_infos_opensearch SET blocks= d  WHERE infos_id= old.infos_id;

UPDATE blocks_infos_opensearch SET blocks= h WHERE infos_id= new.infos_id;

END IF;

END $

DELIMITER ;

另一个需求是需要当对表blocks_infos做相关处理的时候,会触发另一个表bidinfo.v_publish_info 做相应的处理,因为前面已经建立了after insert on blocks_infos,不能再建立  after insert

on blocks_infos,所以只能创建  before insert on blocks_infos,如下创建了三个:

1)insert

DELIMITER $

create trigger tri_insert_blocks_infos1  before insert

on blocks_infos for each row

begin

DECLARE d int;

set d=(select intc   from   bidinfo.v_publish_info  where id=new.infos_id);

if d  is null  then

update bidinfo.v_publish_info set   intc=1    where id= new.infos_id;

else

update bidinfo.v_publish_info set   intc=intc+1    where id= new.infos_id;

end if;

end $

DELIMITER ;

2)delete

DELIMITER $

create trigger tri_delete_blocks_infos1  before delete

on blocks_infos for each row

begin

DECLARE h int;

set h=(select intc   from   bidinfo.v_publish_info  where id=old.infos_id);

if h  is null  then

update bidinfo.v_publish_info set   intc=1    where id= old.infos_id;

else

update bidinfo.v_publish_info set   intc=intc+1    where id= old.infos_id;

end if;

end $

DELIMITER ;

3)update ,注意可以只用两个if循环!

DELIMITER $

create trigger tri_update_blocks_infos1  before update

on blocks_infos for each row

begin

DECLARE j int;

DECLARE i int;

set i=(select intc   from   bidinfo.v_publish_info  where id=new.infos_id);

set j=(select intc   from   bidinfo.v_publish_info  where id=old.infos_id);

if j  is null  then

update bidinfo.v_publish_info set   intc=1    where id= old.infos_id;

else

update bidinfo.v_publish_info set   intc=intc+1    where id= old.infos_id;

end if;

if i  is null  then

update bidinfo.v_publish_info set   intc=1    where id= new.infos_id;

else

update bidinfo.v_publish_info set   intc=intc+1    where id= new.infos_id;

end if;

end $

DELIMITER ;

感谢你能够认真阅读完这篇文章,希望小编分享的“mysql中before和after的区别有哪些”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: mysql中before和after的区别有哪些

本文链接: https://www.lsjlt.com/news/63087.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql中before和after的区别有哪些
    这篇文章主要介绍了mysql中before和after的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。触发器(trigger):监...
    99+
    2022-10-18
  • jquery中after()和before()方法的区别是什么
    本文小编为大家详细介绍“jquery中after()和before()方法的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery中after()和before()方法的区别是什么”文章能帮...
    99+
    2022-10-19
  • mysql中:=和=有哪些区别
    这篇文章主要介绍了mysql中:=和=有哪些区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。:=和=的区别= 只有在set和update时...
    99+
    2022-10-18
  • mysql和db2的区别有哪些
    MySQL是关系数据库管理系统,是一个轻量型且开源、免费的数据库,适合个人网站及一些小企业的网站应用;而DB2是超大型数据库管理系统,与ORACLE类似,数据仓库和数据挖掘相当的不错,特别是集群技术可以使DB2的可扩性能达到极致。MySQL...
    99+
    2022-10-20
  • hive和mysql的区别有哪些
    这篇文章给大家分享的是有关hive和mysql的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。区别:1、Mysql采用了SQL语言,Hive采用了类SQL的查询语言HQ...
    99+
    2022-10-18
  • postgresql和mysql的区别有哪些
    这篇文章主要为大家展示了“postgresql和mysql的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“postgresql和mysql的区别有哪些...
    99+
    2022-10-19
  • mysql和oracle的区别有哪些
    本篇内容主要讲解“mysql和oracle的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql和oracle的区别有哪些”吧! ...
    99+
    2022-10-19
  • sqlite和mysql的区别有哪些
    这篇文章主要为大家展示了“sqlite和mysql的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“sqlite和mysql的区别有哪些”这篇文章吧。 ...
    99+
    2022-10-19
  • MongoDB和MySQL的区别有哪些
    这篇文章主要讲解了“MongoDB和MySQL的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoDB和MySQL的区别有哪些”吧! ...
    99+
    2022-10-19
  • mysqli和mysql的区别有哪些
    这篇文章主要介绍“mysqli和mysql的区别有哪些”,在日常操作中,相信很多人在mysqli和mysql的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysq...
    99+
    2022-10-19
  • oracle和mysql的区别有哪些
    小编给大家分享一下oracle和mysql的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2022-10-19
  • hbase和mysql的区别有哪些
    本篇内容主要讲解“hbase和mysql的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“hbase和mysql的区别有哪些”吧! ...
    99+
    2022-10-19
  • mysql和pgsql的区别有哪些
    1.PostgerSQL完全遵从ACID,确保满足所有ACID的需求;而MySQL只有InnoDB等少量存储引擎遵从ACID,所以客户选取就更加灵活。PostgerSQL是全面支持事务的关系型数据库,不仅DML语句可以在一个事务中,DDL语...
    99+
    2022-10-18
  • mysql中om.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别有哪些
    这篇文章将为大家详细讲解有关mysql中om.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文...
    99+
    2022-10-18
  • Mysql中myisam和innodb的区别有哪些
    这篇文章给大家分享的是有关Mysql中myisam和innodb的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 (1)5点不同 1. 存储结构 &nb...
    99+
    2022-10-18
  • mysql中char和varchar的区别有哪些
    本篇内容主要讲解“mysql中char和varchar的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql中char和varchar的区别有哪些...
    99+
    2022-10-19
  • mysql中clob和blob的区别有哪些
    本篇内容介绍了“mysql中clob和blob的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • mysql中in和or的区别有哪些
    这篇文章主要讲解了“mysql中in和or的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql中in和or的区别有哪些”吧! ...
    99+
    2022-10-19
  • MySQL中REGEXP和LIKE的区别有哪些
    这篇文章主要介绍MySQL中REGEXP和LIKE的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL中,REGEXP经常使用,用于某种模式去匹配某个字符串的一个方式,Like关键字我们也是经常使用,...
    99+
    2023-06-14
  • mysql和oracle有哪些区别
    小编给大家分享一下mysql和oracle有哪些区别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql和oracle的区别...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作