mysql触发器

这篇博客介绍了如何使用MySQL触发器在activities表的更新、插入和删除操作后,动态维护keyword表中的关键词计数。当activities表中的记录发生变化时,触发器会根据keyword字段更新或插入关键词记录,并调整对应的计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更新
DROP TRIGGER IF EXISTS `t_afterupdate_on_activities`;
CREATE TRIGGER t_afterupdate_on_activities 
AFTER UPDATE ON activities
FOR EACH ROW
BEGIN
SET @newkeywords = new.keyword;
  SET @oldkeywords = old.keyword;

IF old.is_deleted = 0 AND old.keyword IS NOT NULL THEN
WHILE @oldkeywords is not null and trim(@oldkeywords) != '' DO
  set @oldkeyword = trim(SUBSTRING_INDEX(@oldkeywords,',',1));
set @oldkeyword2 = trim(SUBSTRING_INDEX(@oldkeywords,',',2));
 set @oldcount = (select count(*) from keyword WHERE keyword = @oldkeyword);
 IF  @oldcount > 0 THEN
UPDATE keyword SET count = (CASE WHEN count IS NULL THEN 0 WHEN count - 1 < 0 THEN 0 ELSE count - 1 END) WHERE keyword = @oldkeyword;
END IF;
SET @oldkeywords = (CASE WHEN @oldkeyword = @oldkeyword2 THEN '' ELSE trim(SUBSTR(@oldkeywords FROM CHAR_LENGTH(@oldkeyword) + 2)) END);
  END WHILE;
END IF;


  IF new.is_deleted = 0 AND new.keyword IS NOT NULL THEN
WHILE @newkeywords is not null and trim(@newkeywords) != '' DO
set @newkeyword = trim(SUBSTRING_INDEX(@newkeywords,',',1));
set @newkeyword2 = trim(SUBSTRING_INDEX(@newkeywords,',',2));
set @newcount = (select count(*) from keyword WHERE keyword = @newkeyword);
IF @newcount = 0 THEN
INSERT INTO keyword(keyword,count,is_deleted) VALUES(@newkeyword,1,0);
ELSE
UPDATE keyword SET count = (CASE WHEN count IS NULL THEN 1 ELSE count + 1  END) WHERE keyword = @newkeyword;
END IF;
SET @newkeywords = (CASE WHEN @newkeyword = @newkeyword2 THEN '' ELSE trim(SUBSTR(@newkeywords FROM CHAR_LENGTH(@newkeyword) + 2)) END);
END WHILE;
END IF;
END;


插入


DROP TRIGGER IF EXISTS `t_afterinsert_on_activities`;
CREATE TRIGGER t_afterinsert_on_activities 
AFTER INSERT ON activities
FOR EACH ROW
BEGIN
SET @newkeywords = new.keyword;
  IF new.is_deleted = 0 THEN
WHILE @newkeywords is not null and trim(@newkeywords) != '' DO
set @newkeyword = trim(SUBSTRING_INDEX(@newkeywords,',',1));
set @newkeyword2 = trim(SUBSTRING_INDEX(@newkeywords,',',2));
set @newcount = (select count(*) from keyword WHERE keyword = @newkeyword);
IF @newcount = 0 THEN
INSERT INTO keyword(keyword,count,is_deleted) VALUES(@newkeyword,1,0);
ELSE
UPDATE keyword SET count = (CASE WHEN COUNT IS NULL THEN 1 ELSE count + 1 END) WHERE keyword = @newkeyword;
END IF;
SET @newkeywords = (CASE WHEN @newkeyword = @newkeyword2 THEN '' ELSE trim(SUBSTR(@newkeywords FROM CHAR_LENGTH(@newkeyword) + 2)) END);
END WHILE;
END IF;
END;




删除


DROP TRIGGER IF EXISTS `t_afterdelete_on_activities`;
CREATE TRIGGER t_afterdelete_on_activities 
AFTER DELETE ON activities
FOR EACH ROW
BEGIN
SET @oldkeywords = old.keyword;
  IF old.is_deleted = 0 THEN
WHILE @oldkeywords is not null and trim(@oldkeywords) != '' DO
set @oldkeyword = trim(SUBSTRING_INDEX(@oldkeywords,',',1));
set @oldkeyword2 = trim(SUBSTRING_INDEX(@oldkeywords,',',2));
set @oldcount = (select count(*) from keyword WHERE keyword = @oldkeyword);
IF @oldcount > 0 THEN
UPDATE keyword SET count = (CASE WHEN COUNT IS NULL THEN 0 WHEN count - 1 < 0 THEN 0 ELSE count - 1 END) WHERE keyword = @oldkeyword;
END IF;
SET @oldkeywords = (CASE WHEN @oldkeyword = @oldkeyword2 THEN '' ELSE trim(SUBSTR(@oldkeywords FROM CHAR_LENGTH(@oldkeyword) + 2)) END);
END WHILE;
END IF;
END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值