2014-07-13 15:37:07
来 源
中存储网
MySQL
在最近的一个搜索项目开发里碰到了一些问题.我需要从多个系统里拉取信息进行分发,采用消息队列可以实现.不过过程可能会复杂一些.现在的方案是通过webservice一旦有更新就push到一张临时表.后台crontab里跑一个脚本从这张临时表里拿数据->分发到不同索
在最近的一个搜索项目开发里碰到了一些问题.我需要从多个系统里拉取信息进行分发,采用消息队列可以实现.不过过程可能会复杂一些.
现在的方案是通过webservice一旦有更新就push到一张临时表.后台crontab里跑一个脚本从这张临时表里拿数据->分发到不同索引表->删除数据.
实际上这里的MYSQL数据库充当了一个消息队列的功能.
为了保证此连贯操作的原子性,需要做一些相关操作.在网上找了半天,发现mysql的触发器可能会完成此项操作.以下内容为转发,具体谁先首发我也没搞清…
当执行delete、update或insert操作时,可以使用触发器来触发某些操作。
创建触发器:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name
FOR EACH ROW trigger_stmt
其中 trigger_name是触发器名,

trigger_time:BEFORE,AFTER
trigger_event:INSERT、UPDATE、DELETE
tbl_name:关联的表名
注意,INSERT除了插入操作,load data也能激活该事件。对于同一trigger_event,不能有两个相同trigger_time的触发器。
trigger_stmt:触发器被激活时执行的语句,可以使用单条语句,也可以使用BEGIN——END这样的复合语句。
例如:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
    -> FOR EACH ROW SET @sum = @sum + NEW.amount;
mysql> SET @sum = 0;
mysql> INSERT INTO account values(5,12.5);
mysql> SELECT @num;
在该例子中,关键字NEW.col_name在INSERT触发程序中引用;
另外一个关键字OLD.col_name可用于DELETE中
NEW和OLD均可用于UPDATE触发程序中。
old命令的列为只读的,new命名的列,如果具有select权限,可引用它,如果在before出发程序中,具有update权限,可使用set new.col_name = value的方法,在插入前更改值
另一个例子:
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
    -> FOR EACH ROW
    -> BEGIN
    -> IF NEW.amount < 0 THEN
    -> SET NEW.amount = 0;
    -> ELSEIF NEW.amount > 100 THEN
    -> SET NEW.amount = 100;
    -> END IF;
    -> END;//
mysql> delimiter ;
当然,这里可以先定义存储程序,然后在触发器内call存储程序,这样就可以对存储程序进行复用。
删除触发器:
DROP TROGGER trigger_name

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。