MySQL 触发器 循环写入

MySQL 触发器 循环写入

    • 触发器
      • 引入问题
      • 改进方案
      • 了解MySQL触发器
      • 编写触发器

触发器

引入问题

现在有一张商品表(t_app_mall)和一张奖品号码表(t_app_mall_no)。当向商品表中添加一条商品记录后,根据商品表中的参与人数的字段,生成对应数量的奖品号码,并循环加入奖品号码表中!(奖品号码表中的商品id 对应发布的商品。多对一的关系!)
因为每一次发布商品的所设置的参与人数不同,当某一个用发布商品的时候,设置的参与人数过多,这个时候向奖品号码表中循环插入数据就比较耗时。因为每次请求是同步的,所以用户等待的时间就增加。。对用户相对不是太友好!

改进方案

考虑到每一次insert/update之后就需要向奖品号码表插入对应数量的数据(update的话如果用户修改商品信息时没有修改需要参与人,则不需要更改t_app_mall_no),可以使用MySQL的触发器来实现此功能!

了解MySQL触发器

定义:
触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。
基本模板:

CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
BEGIN
[statement_list]
END

解释:
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。

由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。

另外有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器。

编写触发器

1.写入时触发 定时器

CREATE  TRIGGER `insert_num_no` AFTER INSERT ON `t_app_mall` FOR EACH ROW 
BEGIN
--  
DECLARE num int (11);
-- 
DECLARE base int (11);
DECLARE x int (11);
	set num = (select mall_participate from t_app_mall where id = new.id);
		set x = 0;
		set base = 10000001;
		if(num>0) then
			while x < num do 
				insert into t_app_mall_no 
					(mall_id,
					mall_num,
					num_status,
					create_time,
					update_time) 
				values 
					(new.id,
					10000001+x,
					0,
					CURRENT_TIMESTAMP,
					CURRENT_TIMESTAMP);
			set x=x+1; 
			end while ;
		end if;
  
END;

2.更新商品表后判断参与人数是否改变

CREATE  TRIGGER `update_num_no` AFTER UPDATE ON `t_app_mall` FOR EACH ROW BEGIN
-- 定义基础数据
	DECLARE base int(11);
-- 获取update前后 参与人数的变化
  DECLARE old_num int(11);
	DECLARE new_num int(11);

-- 赋值
	set old_num = old.mall_participate;
	set new_num = new.mall_participate;
	if(old_num != new_num) then 
		DELETE FROM t_app_mall_no where mall_id = new.id;
		-- 
		set base = 0;
		while base < new_num do 
			insert into t_app_mall_no 
					(mall_id,
					mall_num,
					num_status,
					create_time,
					update_time) 
				values 
					(new.id,
					10000001+base,
					0,
					CURRENT_TIMESTAMP,
					CURRENT_TIMESTAMP);
					set base = base +1;
		end while;
	end if;
	
END;

先写到这!!

你可能感兴趣的:(mysql)