在数据库的触发器中经常会用到更新前的值和更新后的值,所有要理解new和old的作用很重要。当时我有个情况是这样的:我要插入一行数据,在行要去其他表中获得一个单价,然后和这行的数据进行相乘的到总金额,将该行的金额替换成相乘的结果。

一开始我使用的after,然后对自身的值进行更改。

  insert update delete
old null 实际值 实际值
new 实际值 实际值 null

在Oracle中用:old:new表示执行前的行,和执行后的行。在MySQL中用oldnew表示执行前和执行后的数据。

问题的起源

之前对数据库的触发器是这样写的,

 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在用于取值?因为赋值没意义?

最新文章

  1. mongodb的修改器
  2. Python 生产环境MySQL数据库增量备份脚本
  3. awk实现按照某个字段排序
  4. lua module package.seeall选项
  5. LeetCode 176 Second Highest Salary mysql,select 嵌套 难度:1
  6. 第二十课:js中如何操作元素的属性系统
  7. XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析
  8. Java for LeetCode 153 Find Minimum in Rotated Sorted Array
  9. hadoop环境搭建遇到问题集锦
  10. iOS-MVC详解
  11. DOJO 八 event dojo/on
  12. 飘逸的python - 解决一个有限制的组合需求
  13. jQuery 的.data()方法
  14. Amazon SQS简单介绍 上篇
  15. linux 工具
  16. 14 - How to check replication status
  17. Python字符编码以及循环机制介绍
  18. canvas打字效果
  19. python调用ansible接口API执行命令
  20. 百度BAE的使用

热门文章

  1. 6.使用AngularJS模板来创建视图
  2. 16 BasicHashTable基本哈希表类(三)——Live555源码阅读(一)基本组件类
  3. composer 的使用
  4. django缓存
  5. 细化如何安装LNMP + Zabbix 监控安装文档以及故障排除
  6. c++ SOA Axis2c 编译安装
  7. python程序性能分析
  8. keystone v3 相关介绍
  9. 为MongoDB创建一个Windows服务
  10. poj 1442