分享好友 数据库首页 频道列表

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

MySQL教程  2015-11-06 12:090

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教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
MySQL与Oracle 差异比较之六触发器
触发器编号类别ORACLEMYSQL注释1创建触发器语句不同create or replace trigger TG_ES_FAC_UNIT  before insert or update or delete on ES_FAC_UNIT  for each rowcreate trigger `hs_esbs`.`TG_INSERT_ES_FAC_UNIT` BEFORE INSERT on `hs_esbs`.`es_fac_u

0评论2023-02-10914

MYSQL和ORACLE的触发器与存储过程语法差异
整改了一番脚本,遇到了一些两种数据库之间的差异,记录一下:触发器:差异MYSQLORACLE说明创建语句不同create trigger `AA` BEFORE INSERT on `BB` for each row create or replace trigger AA  before insert or update or delete on BB  for each ro

0评论2023-02-10407

SQLSever中的触发器基本语法与作用
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。本文给大家介绍SQLSever中的触发器基本语法与作用,感兴趣的朋友一起学习吧

0评论2016-05-1875

Oracle触发器用法实例详解
这篇文章主要介绍了Oracle触发器用法,结合实例形式详细分析了Oracle触发器的概念,功能,语法及相关使用技巧,需要的朋友可以参考下

0评论2016-05-18141

MySQL笔记之触发器的应用
触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句

0评论2015-11-09107

基于mysql事务、视图、存储过程、触发器的应用分析
本篇文章是对mysql事务、视图、存储过程、触发器的应用进行了详细的分析介绍,需要的朋友参考下

0评论2015-11-0988

ORACLE PL/SQL 触发器编程篇介绍
ORACLE PL/SQL 触发器能够完成由数据库的完整性约束难以完成的复杂业务规则的约束;监视数据库的各种操作以及实现审计功能

0评论2015-11-08135

MySQL中触发器入门简单实例与介绍
本文章来mysql初学者介绍在mysql怎么创建触发器及触发器在mysql执行顺序,下面我来给大家详细介绍

0评论2015-11-07105

深入浅析SQL Server 触发器
触发器是一种特殊的存储过程,触发器是通过事件触发可以自动调用执行的。在sql2005中,触发器可以分为dml触发器和ddl触发器。下面通过本篇文章给大家深入浅析sqlserver触发器,需要的朋友可以参考下

0评论2015-11-0786

数据库触发器DB2和SqlServer有哪些区别
大部分数据库语句的基本语法是相同的,但具体到的每一种数据库,又有些不一样,例如触发器,DB2和SQL Server两种很大的不同。对数据库触发器DB2和SqlServer有哪些区别感兴趣的朋友一起看看本文吧

0评论2015-11-0776

Mysql中的触发器简单介绍及使用案例
触发器可以监听着数据表的某个行为,一旦数据表的这个行为发生了,马上执行相应的sql语句,下面有个不错的案例大家可以研究下

0评论2015-11-06112

mysql触发器(Trigger)简明总结和使用实例
这篇文章主要介绍了mysql触发器(Trigger)简明总结和使用实例,需要的朋友可以参考下

0评论2015-10-27140

Oracle数据创建虚拟列和复合触发器的方法
Oracle的虚拟列解决了很多需要使用触发器或者需要通过代码进行计算统计产生数据信息的问题,而复合触发器实际上是作为一个整体定义的四个不同的触发器来执行操作,需要了解的朋友可以参考下

0评论2015-10-0968

oracle 存储过程和触发器复制数据
oracle 存储过程和触发器复制数据的代码,需要的朋友可以参考下。

0评论2015-09-2055

Oracle创建主键自增表(sql语句实现)及触发器应用
主键自增在插入数据的时候是很实用的,可以获取并操作返回的插入记录的ID,接下来介绍Oracle如何创建主键自增表,感兴趣的你可以了解下,就当是巩固知识,希望此文对你有所帮助

0评论2015-08-25125

SQL查询出表、存储过程、触发器的创建时间和最后修改时间示例
这篇文章主要介绍了SQL查询出表、存储过程、触发器的创建时间和最后修改时间示例,本文直接给出代码实例,需要的朋友可以参考下

0评论2015-08-13115

MYSQL设置触发器权限问题的解决方法
这篇文章主要介绍了MYSQL设置触发器权限问题的解决方法,需要的朋友可以参考下

0评论2015-08-0767

更多推荐