热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql触发器实现oracle物化视图示例代码_MySQL

mysql触发器实现oracle物化视图示例代码
bitsCN.com

oracle数据库支持物化视图--不是基于基表的虚表,而是根据表实际存在的实表,即物化视图的数据存储在非易失的存储设备上。
下面实验创建ON COMMIT 的FAST刷新模式,在mysql中用触发器实现insert , update , delete 刷新操作
1、基础表创建,Orders 表为基表,Order_mv为物化视图表

mysql> create table Orders( 
-> order_id int not null auto_increment, 
-> product_name varchar(30)not null, 
-> price decimal(10,0) not null , 
-> amount smallint not null , 
-> primary key (order_id)); 
Query OK, 0 rows affected 
mysql> create table Order_mv( 
-> product_name varchar(30) not null, 
-> price_sum decimal(8.2) not null, 
-> amount_sum int not null, 
-> price_avg float not null, 
-> order_cnt int not null, 
-> unique index(product_name)); 
Query OK, 0 rows affected


2、insert触发器

delimiter $$ 
create trigger tgr_Orders_insert 
after insert on Orders 
for each row 
begin 
set @old_price_sum=0; 
set @old_amount_sum=0; 
set @old_price_avg=0; 
set @old_orders_cnt=0; 
select ifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(order_cnt,0) 
from Order_mv 
where product_name=new.product_name 
into @old_price_sum,@old_amount_sum,@old_price_avg,@old_orders_cnt; 
set @new_price_sum=@old_price_sum+new.price; 
set @new_amount_sum=@old_amount_sum+new.amount; 
set @new_orders_cnt=@old_orders_cnt+1; 
set @new_price_avg=@new_price_sum/@new_orders_cnt; 
replace into Order_mv 
values(new.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt); 
end; 
$$ 
delimiter ;


3、update触发器

delimiter $$ 
create trigger tgr_Orders_update 
before update on Orders 
for each row 
begin 
set @old_price_sum=0; 
set @old_amount_sum=0; 
set @old_price_avg=0; 
set @old_orders_cnt=0; 
set @cur_price=0; 
set @cur_amount=0; 
select price,amount from Orders where order_id=new.order_id 
into @cur_price,@cur_amount; 
select ifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(order_cnt,0) 
from Order_mv 
where product_name=new.product_name 
into @old_price_sum,@old_amount_sum,@old_price_avg,@old_orders_cnt; 
set @new_price_sum=@old_price_sum-@cur_price+new.price; 
set @new_amount_sum=@old_amount_sum-@cur_amount+new.amount; 
set @new_orders_cnt=@old_orders_cnt; 
set @new_price_avg=@new_price_sum/@new_orders_cnt; 
replace into Order_mv 
values(new.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt); 
end; 
$$

delimiter ;

4、delete触发器

delimiter $$ 
create trigger tgr_Orders_delete 
after delete on Orders 
for each row 
begin 
set @old_price_sum=0; 
set @old_amount_sum=0; 
set @old_price_avg=0; 
set @old_orders_cnt=0; 
set @cur_price=0; 
set @cur_amount=0; 
select price,amount from Orders where order_id=old.order_id 
into @cur_price,@cur_amount; 
select ifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(order_cnt,0) 
from Order_mv 
where product_name=old.product_name 
into @old_price_sum,@old_amount_sum,@old_price_avg,@old_orders_cnt; 
set @new_price_sum=@old_price_sum - old.price; 
set @new_amount_sum=@old_amount_sum - old.amount; 
set @new_orders_cnt=@old_orders_cnt - 1; 
if @new_orders_cnt>0 then 
set @new_price_avg=@new_price_sum/@new_orders_cnt; 
replace into Order_mv 
values(old.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt); 
else 
delete from Order_mv where product_name=@old.name; 
end if; 
end; 
$$ 
delimiter ;


5、这里delete触发器有一个bug,就是在一种产品的最后一个订单被删除的时候,Order_mv表的更新不能实现,不知道这算不算是mysql的一个bug。当然,如果这个也可以直接用sql语句生成数据,而导致的直接后果就是执行效率低。

-> insert into Order_mv 
-> select product_name ,sum(price),sum(amount),avg(price),count(*) from Orders 
-> group by product_name;

以上就是mysql触发器实现oracle物化视图示例代码_MySQL的内容,更多相关内容请关注PHP中文网(www.php1.cn)!

推荐阅读
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
  • 本文探讨了MySQL中的死锁现象及其监控方法,并介绍了如何通过配置和SQL语句调整来优化数据库性能。同时,还讲解了慢查询日志的配置与分析技巧。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 本文介绍了MySQL窗口函数的基本概念、应用场景及常见函数的使用方法。窗口函数在处理复杂查询时非常有用,例如计算每个用户的订单排名、环比增长率、以及动态聚合等。 ... [详细]
  • 本文介绍了如何在 Oracle 数据库中查询重复数据,并提供了多种方法来筛选和删除重复记录,包括基于单个字段和多个字段的重复数据处理。 ... [详细]
  • 本文提供了处理WordPress网站中出现过多重定向问题的方法,包括检查DNS配置、安装SSL证书以及解决数据库连接错误等步骤。 ... [详细]
  • 最适合初学者的编程语言
    本文探讨了适合编程新手的最佳语言选择,包括Python、JavaScript等易于上手且功能强大的语言,以及如何通过有效的学习方法提高编程技能。 ... [详细]
  • 在Android应用开发过程中,开发者经常遇到诸如CPU使用率过高、内存泄漏等问题。本文将介绍几种常用的命令及其应用场景,帮助开发者有效定位并解决问题。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
author-avatar
手机用户2502877211
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有