mysql触发器update实例(mysql触发器实现oracle物化视图示例代码)
本文目录
mysql触发器实现oracle物化视图示例代码
oracle数据库支持物化视图--不是基于基表的虚表,而是根据表实际存在的实表,即物化视图的数据存储在非易失的存储设备上。下面实验创建ONCOMMIT的FAST刷新模式,在mysql中用触发器实现insert,update,delete刷新操作1、基础表创建,Orders表为基表,Order_mv为物化视图表复制代码代码如下:mysql》createtableOrders(-》order_idintnotnullauto_increment,-》product_namevarchar(30)notnull,-》pricedecimal(10,0)notnull,-》amountsmallintnotnull,-》primarykey(order_id));QueryOK,0rowsaffectedmysql》createtableOrder_mv(-》product_namevarchar(30)notnull,-》price_sumdecimal(8.2)notnull,-》amount_sumintnotnull,-》price_avgfloatnotnull,-》order_cntintnotnull,-》uniqueindex(product_name));QueryOK,0rowsaffected2、insert触发器复制代码代码如下:delimiter$$createtriggertgr_Orders_insertafterinsertonOrdersforeachrowbeginset@old_price_sum=0;set@old_amount_sum=0;set@old_price_avg=0;set@old_orders_cnt=0;selectifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(order_cnt,0)fromOrder_mvwhereproduct_name=new.product_nameinto@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;replaceintoOrder_mvvalues(new.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt);end;$$delimiter;3、update触发器复制代码代码如下:delimiter$$createtriggertgr_Orders_updatebeforeupdateonOrdersforeachrowbeginset@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;selectprice,amountfromOrderswhereorder_id=new.order_idinto@cur_price,@cur_amount;selectifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(order_cnt,0)fromOrder_mvwhereproduct_name=new.product_nameinto@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;replaceintoOrder_mvvalues(new.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt);end;$$delimiter;4、delete触发器复制代码代码如下:delimiter$$createtriggertgr_Orders_deleteafterdeleteonOrdersforeachrowbeginset@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;selectprice,amountfromOrderswhereorder_id=old.order_idinto@cur_price,@cur_amount;selectifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(order_cnt,0)fromOrder_mvwhereproduct_name=old.product_nameinto@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》0thenset@new_price_avg=@new_price_sum/@new_orders_cnt;replaceintoOrder_mvvalues(old.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt);elsedeletefromOrder_mvwhereproduct_name=@old.name;endif;end;$$delimiter;5、这里delete触发器有一个bug,就是在一种产品的最后一个订单被删除的时候,Order_mv表的更新不能实现,不知道这算不算是mysql的一个bug。当然,如果这个也可以直接用sql语句生成数据,而导致的直接后果就是执行效率低。复制代码代码如下:-》insertintoOrder_mv-》selectproduct_name,sum(price),sum(amount),avg(price),count(*)fromOrders-》groupbyproduct_name;
mysql 触发器 update
有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。1. check table 和 repair table登陆mysql 终端:mysql -uxxxxx -p dbnamecheck table tabTest;如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:repair table tabTest;进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。2. myisamchk, isamchk其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:myisamchk tablename.MYI进行检测,如果需要修复的话,可以使用:myisamchk -of tablename.MYI关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。-----------------------------另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前: && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。需要注意的时,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!检测修复所有数据库(表)
MySQL中建立一个update触发器,如果某字段变为0则删去该行
mysql》 CREATE TABLE t (id INT, count INT);Query OK, 0 rows affected (0.05 sec)mysql》 DELIMITER //mysql》 CREATE TRIGGER BeforeUpdateT -》 AFTER UPDATE ON t -》 FOR EACH ROW -》 BEGIN -》 IF new.count = 0 THEN -》 DELETE FROM t WHERE id = new.id; -》 END IF; -》 END; -》 //Query OK, 0 rows affected (0.06 sec)mysql》 INSERT INTO t VALUES(1, 100) //Query OK, 1 row affected (0.01 sec)mysql》 UPDATE t SET `count` = 0 //ERROR 1442 (HY000): Can’t update table ’t’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.建了一个,结果失败了。原因是 MySQL 触发器里面,不让你更新被触发的表。
更多文章:

loaders(android loaders 什么时候使用)
2025年3月12日 21:40

publicizing(publicity reaches a mass audience 怎么翻译)
2025年3月22日 23:10

sql语句增删改查语法(SQLSERVER 增删改语句是如何写的常用的都有那些函数,具体用法简单描述下!)
2025年3月10日 13:00

beyond是什么意思(黄家驹乐队的英文全称是BEYOND,BEYONG,BEYANG的哪一个呢)
2025年3月4日 05:30

grep 多个关键字(linux中grep和find的区别)
2025年2月9日 14:00

bootstraptable隐藏某一列(bootstrap-table批量隐藏行怎么做呢)
2025年3月24日 13:20

jquery下拉菜单特效(用jquery怎样做一个有弹动效果的下拉菜单)
2025年4月4日 13:50

c语言的移位运算符(C语言问题,在位运算中,操作数每右移一位,其结果相当于什么若左移1位,其结果相当于什么)
2025年3月23日 18:10

ultimately和finally的区别(英语单词eventually和finally有什么区别)
2025年3月6日 09:00