MYSQL数据库mysql触发器实现oracle物化视图示例代码

MYSQL数据库mysql触发器实现oracle物化视图示例代码,第1张

概述介绍《MYSQL数据库mysql触发器实现oracle物化视图示例代码》开发教程,希望对您有用。 @H_301_0@《MysqL数据库MysqL触发器实现oracle物化视图示例代码》要点:
本文介绍了MysqL数据库MysqL触发器实现oracle物化视图示例代码,希望对您有用。如果有疑问,可以联系我们。

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

代码如下:
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,ifnull(price_avg,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,@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_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,0)
from Order_mv
where product_name=old.product_name
into @old_price_sum,@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_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数据库mysql触发器实现oracle物化视图示例代码全部内容,希望文章能够帮你解决MYSQL数据库mysql触发器实现oracle物化视图示例代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1163945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存