-
2020-05-18 16:21:29更多相关内容
-
MySQL触发器之 new 和 old 的理解
2021-01-18 18:20:41在数据库的触发器中经常会用到更新前的值和更新后的值,所有要理解new和old的作用很重要。当时我有个情况是这样的:我要插入一行数据,在行要去其他表中获得一个单价,然后和这行的数据进行相乘的到总金额,将该行的...在数据库的触发器中经常会用到更新前的值和更新后的值,所有要理解new和old的作用很重要。当时我有个情况是这样的:我要插入一行数据,在行要去其他表中获得一个单价,然后和这行的数据进行相乘的到总金额,将该行的金额替换成相乘的结果。
一开始我使用的after,然后对自身的值进行更改。
insert
update
delete
old
null
实际值
实际值
new
实际值
实际值
null
在Oracle中用:old和:new表示执行前的行,和执行后的行。在MySQL中用old和new表示执行前和执行后的数据。
问题的起源
之前对数据库的触发器是这样写的:
CREATE TRIGGER triggerName after insert ON consumeinfo
FOR EACH ROW
BEGIN
UPDATE consumeinfo SET new.金额=0;
END;
触发器创建没问题,但是插入数据出现以下错误。
[Err] 1442 - Can't update table 'consumeinfo' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
但是通过上网搜索的结果说对本表进行修改不用使用 update consumeinfo,直接使用SET new.金额=0。这个做法对的,因为这样使用new先对当前的金额改变了,然后存到数据库中的,不用使用update consumeinfo。
经过一番努力,以下是成功后的代码,贴出来看看
CREATE TRIGGER addnewReco BEFORE INSERT ON consumeinfo FOR EACH ROW
BEGIN
SET new.金额 = (
SELECT `单价`
FROM pricenow
WHERE `类型` = new.类型
) * new.数量;
END;
后来在吃饭的时候突然想到new和old在after和before上使用情况不同。其实还是因为new不能在after进行赋值,只能进行读取,复制要在before时赋值。
new和old的使用情况
下面具体说说old和new的使用情况。在对new赋值的时候只能在触发器before中只用,在after中是不能使用的,比如(以下是正确的)。
CREATE TRIGGER updateprice
BEFORE insert ON consumeinfo
FOR EACH ROW
BEGIN
set new.金额=0;
END;
这个说明对当前插入数据进行更新的时候使用before先更新完,然后才插入到数据库中的,在after的触发器中,new的赋值已经结束了,只能读取内容。 如果使用after不能使用new赋值,只能取值,否则会出错误,比如
CREATE TRIGGER updateprice
AFTER insert ON consumeinfo
FOR EACH ROW
BEGIN
set new.金额=0;
END;
出现这样的错误:
[Err] 1362 - Updating of NEW row is not allowed in after trigger
总结:new在before触发器中赋值,在after触发器中取值。old在用于取值?因为赋值没意义?
-
mysql触发器new和old
2021-01-21 07:42:25下面为您介绍mysql触发器new old的相关知识,供您参考学习,如果您在mysql触发器方面遇到过类似的问题,不妨一看,相信对您会有所帮助。mysql触发器new old:"NEW . column_name"或者"OLD . column_name".这样在技术...下面为您介绍mysql触发器new old的相关知识,供您参考学习,如果您在mysql触发器方面遇到过类似的问题,不妨一看,相信对您会有所帮助。
mysql触发器new old:
"NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)新和旧
的列名属于创建了过渡变量("transition variables")。
对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及
OLD同时使用。下面是一个UPDATE中同时使用NEW和OLD的例子。
CREATE TRIGGER tr1
BEFORE UPDATE ON t22
FOR EACH ROW
BEGIN
SET @old = OLD.s1;
SET @new = NEW.s1;
END;
现在如果t21表中的s1列的值是55,那么执行了"UPDATE t21 SET s1 = s1 + 1"之后@old的值会变成55,
而@new的值将会变成56。
触发器的执行间隔:FOR EACH ROW子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
列值递增:
create table a(
id int primary key auto_increment,##设置为自动递增
name varchar(10)
);
设置初始值为1000 :
ALTER TABLE tablename AUTO_INCREMENT=1000;
MySQL触发器如何正确使用
MySQL触发器如何正确使用 2010-05-18 15:58 佚名 博客园 字号:T | T 我们今天主要向大家介绍的是MySQL触发器进行正确使用,其中包括对MySQL触发器发器的语句创建,触发时 ...
【转】mysql触发器的实战(触发器执行失败,sql会回滚吗)
1 引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...
redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)
一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...
mysql触发器的例子--插入前更新数据
本文介绍下,一个mysql触发器的例子,在数据插入前更新相关内容,有需要的朋友参考下. mysql触发器的例子,如下: view source print? 001 mysql> CREATE ...
mysql触发器的作用及语法
触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有下面的作用: 1.安全性.能够基于数据库的值使用户具有 ...
MySQL 触发器结构及三个案例demo
--你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了.这跟SQL的标准有所不同. CREATE TRIGGER语法 CREATE TRIGG ...
利用MySQL触发器实现check和assertion
MySQL虽然输入check语句不会报错,但是实际上并没有check的功能.但是MySQL 依然可以利用触发器来实现相应功能. 本文将根据两个例子简要阐述MySQL实现check和assertion的 ...
猎八哥浅谈MYSQL触发器
什么是MYSQL触发器,我们先了解一下触发的意思.触发的字面意思是指因触动而激发起某种反应. MYSQL必知必会中对触发器的解释是:MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于 B ...
MYSQL触发器在PHP项目中用来做信息备份、恢复和清空
案例:通过PHP后台代码可以将员工的信息删除,将删除的员工信息进行恢复(类似于从回收站中恢复员工信息),并且还可以将已经删除的员工进行清空(类似于清空回复站的功能). 思路:要有一张员工表,还要有一张 ...
MySQL触发器在PHP项目中用来做信息备份、恢复和清空的方法介绍
案例:通过PHP后台代码可以将员工的信息删除,将删除的员工信息进行恢复(类似于从回收站中恢复员工信息),并且还可以将已经删除的员工进行清空(类似于清空回复站的功能). 思路:要有一张员工表,还要有一张 ...
随机推荐
零基础在线制作Windows Phone 8 应用
任何用户(不管你是否会编程),只要你有浏览器,都可以使用 Windows Phone App Studio (下文中用App Studio指代) 快速制作出一个属于你的Windows Phone的应用 ...
scrollToItemAtIndexPath: atScrollPosition: animated:
oh my god 今天死在scrollToItemAtIndexPath: atScrollPosition: animated:方法上面,scrollPosition这个参数控制cell具体停留在 ...
oracle job的写法
DECLAREX NUMBER;begin sys.dbms_job.submit(job => x, what => 'begindd_income_risk_control;end;' ...
关于在SharePoint2013中弹出模态化窗口的问题及关闭事件。
js: /*弹出对话框方法开始*//** 弹窗方法(需要回传值时,自定义回调方法)* @url: 弹出窗口页面url* @width: 宽度* @height: 高度* @callback: 回调函数 ...
mvc:annotation-driven' must have no character or element问题
使用SpringMVC,启动tomcat报这个错误 解决办法 首先将Spring版本提升到3.1及以上 如果还不行替换xml文件头部: <?xml version="1.0" ...
浅谈Struts2(二)
一.struts2的跳转 1.action跳转JSP a.默认为forward
-
mysql触发器——NEW与OLD aes_encrypt AES_DECRYPT
2022-05-09 11:16:20mysql触发器——NEW与OLD aes_encrypt AES_DECRYPTmysql触发器中, NEW关键字,和 MS SQL Server 中的 INSERTED 和 DELETED 类似,MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。
具体地:
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用。
原文链接:https://blog.csdn.net/bcfdsagbfcisbg/article/details/78338434#insert之前
CREATE TRIGGER tb_merchant_user_encryption_insert
BEFORE INSERT ON tb_merchant_user FOR EACH ROW
BEGIN
if new.login_name is not null then
set new.login_name=aes_encrypt(new.login_name, ‘login_name’);
end if;
END;#update之前把
CREATE TRIGGER tb_merchant_user_encryption_update
BEFORE UPDATE ON tb_merchant_user FOR EACH ROW
BEGIN
if new.login_name is not null then
set new.login_name=aes_encrypt(new.login_name, ‘login_name’);
end if;
END;is not null 在 new.login_name为null 时会失效 改为 null!=new.login_name
如需加入字符判断 length(trim(new.login_name))>0 -
mysql触发器new old用法详解
2018-07-16 22:29:47mysql触发器new old用法详解 2018年07月05日 17:03:55 阅读数:42 1.当使用insert语句的时候,如果原表中没有数据的话,那么对于插入数据后表来说新插入的那条数据就是new,如图所示: 2.当使用delete语句... -
mysql触发器new old的实例详解
2021-01-18 17:55:28本文主要内容:mysql触发器new old用法详解mysql触发器new old:"NEW . column_name"或者"OLD . column_name".在技术上处理(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量("transition variables")。对于... -
mysql基础(51)_触发器应用(new、old关键字)
2021-05-23 02:02:51在触发器中,可以通过old和new来获取绑定表中对应的记录数据。基本语法:关键字.字段名 old和new并不是所有触发器都有 insert:插入前全为空,没有old delete:清空数据,没有new -- 自动扣除商品库存的触发器 ... -
mysql 触发器OLD和NEW关键字
2015-01-06 15:49:06使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中... -
mysql触发器new和old区别 阿星小栈
2021-01-27 00:55:27mysql触发器new old详解mysql触发器new old:"NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量("transition variables")。对于INSERT语句,只有... -
Mysql,触发器Before,After,new,old
2021-01-19 02:02:10Before与After区别:before:(insert、update)可以对new进行修改。after不能对new进行修改。...这个触发的时间分为BEFORE和AFTER两种,分别有beforeinsert,before update,before delete和after insert,after upda... -
Mysql 触发器中的new 和 old
2021-01-19 14:19:56下面为您介绍mysql触发器new old的相关知识,供您参考学习,如果您在mysql触发器方面遇到过类似的问题,不妨一看,相信对您会有所帮助。mysql触发器new old:"NEW . column_name"或者"OLD . column_name".这样在技术... -
MySQL 触发器的使用和理解
2021-03-13 22:17:001.触发器是什么?一类特殊的数据库程序,可以监视某种数据的操作(insert/update/...Mysql好像是从5.0以后开始支持触发器的。2.创建触发器创建触发器我将介绍两种方式:用语句创建,用navicat创建。创建触发器的... -
mysql触发器中的new和old
2021-10-23 16:20:33上一篇中,简单使用触发器同步俩个表的数据,但是出现了old和new的用法,这一篇文章中简单总结一下。 1.插入操作 insert 对于insert语句,如果原表中没有数据,那么对于插入数据后表来说新插入的那条数据就是new。... -
mysql触发器new old介绍
2021-01-19 00:07:33下面为您介绍mysql触发器new old的相关知识,供您参考学习,如果您在mysql触发器方面遇到过类似的问题,不妨一看,相信对您会有所帮助。mysql触发器new old:"NEW . column_name"或者"OLD . column_name".这样在技术... -
mysql 触发器实现两个表的数据同步
2021-01-19 22:21:53mysql通过触发器实现两个表的同步 目前,在本地测试成功。 假设本地的两个数据库a和b,a下有表table1(id, val) b下有表table2(id, val) 假设希望当table1中数据更新,table2中数据同步更新。 代码: DELIMITER $... -
mysql触发器new old详解_MySQL
2021-01-19 00:25:26bitsCN.commysql触发器new old详解mysql触发器new old:"NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量("transition variables")。对于... -
mysql触发器——NEW与OLD解析
2017-10-25 10:40:10mysql触发器中, NEW关键字,和 MS SQL Server 中的 INSERTED 和 DELETED 类似,MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。 具体地: 在 INSERT 型触发器中,NEW 用来... -
mysql触发器的使用方法
2021-04-20 06:50:46开发环境win764+mysql5.6mysql触发器的基本语法createtrigger触发器名字after/beforeinsert/update/deleteon表名foreachrowbegin#一些sql语法end;解发器执行的sql语句可以放在begin end中间,执行的语句中可以对当前... -
mysql 触发器 new.id
2021-03-03 21:52:07mysql 的触发器目前不能对当前表进行操作 create trigger update_Student BEFORE update on student FOR EACH ROW delete from articles where id=8; 这个例子不是......trigger insert_trigger after insert on ... -
MySQL触发器详解
2021-04-12 17:34:41触发器定义 ...触发时间:前后before 和after After:是表示触发事件的操作在执行之后才激活触发器 ; Before:是在触发事件操作执行之前激活触发器 触发对象:表中的每一条记录(行) 一张表最后有... -
关于MySQL触发器new和old
2021-01-28 07:10:37下面为您介绍 MySQL 触发器new old的相关知识,供您参考学习,如果您在MySQL触发器方面遇到过类似的问题,不妨一看,相信对您会有所帮助。mysql触发器new old:"NEW . column_name"或者"OLD . column_name".这样在... -
mysql触发器new old 详解 真实例子
2013-01-26 11:22:05mysql触发器new old: "NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)新和旧 的列名属于创建了过渡变量("transition variables")。 对于INSERT语句,只有NEW是...