mysql触发器学习

一张表t1,两个字段,id和name字段,要实现一个功能,在往这张表里面插入数据的时候,如果表中有与插入的数据name字段相同的字段,则更新id字段,

之前没写过,不过大概记得以前学习mssql的时候有个东西可以早对表进行inser update delete的时候触发一些动作,搜了下果然找到了,是触发器!

兴致勃勃的看了下资料,最后发现,mysql不能在当前触发器中操作当前表中的数据。。。。。

下面是代码:

DELIMITER |
CREATE TRIGGER test1 BEFORE INSERT on `test1` FOR EACH ROW 
BEGIN 
DELETE FROM `test1` WHERE t1_name=new.t1_name;
END
|
delimiter ;

虽然需要的东西没有做出来,但是也算是学习了

还是把需要做的东西弄出来了,用到了一个临时表。。

开始用的是

DELIMITER |
CREATE TRIGGER insert_updata BEFORE INSERT on `key_temp` FOR EACH ROW 
BEGIN 
DECLARE temp INT(3);
SET temp=(SELECT COUNT(*) FROM `key_gjc` WHERE key_name=new.key_name);
IF temp>0 THEN 
delete from `key_gjc` WHERE f=new.f;
INSERT INTO `key_gjc` (a,b,c,d,e,f) VALUES (new.a,new.b,new.c,new.d,new.e,new.f);
END IF;
END
|
delimiter ;
这种方法就实现了需要的效果,但是后来出现了一个问题,因为后来表又加了一个字段g,开始插入的时候,这个字段是空的,譬如该条记录如下

a         b       c      d       e           f             g

张三   22    男     111   30kg     3000    null

但是可能会对这条记录的g字段进行更改,譬如更改之后的记录为

a         b       c      d       e           f             g

张三   22    男     111   30kg     3000    小说

那么,如果再对key_temp表插入数据的时候,会触发触发器,根据触发器的逻辑,会实现更新,但是g字段的值就丢失了,所以进行了改进,于是又稍稍接触了下mysql的变量定义和流程控制语句~~~~,如下,有个问题,在if里面的sql语句,一定要记得结尾的分号啊,因为这个调了半天。。。。。。

DELIMITER |
CREATE TRIGGER insert_updata BEFORE INSERT on `key_temp` FOR EACH ROW 
BEGIN 
DECLARE temp INT(3);
SET temp=(SELECT COUNT(*) FROM `key_gjc` WHERE key_name=new.key_name);
IF temp>0 THEN 
UPDATE `key_gjc` SET a=new.a,b=new.b,c=new.c,d=new.d,e=new.e WHERE f=new.f;
ELSE 
INSERT INTO `key_gjc` (a,b,c,d,e,f) VALUES (new.a,new.b,new.c,new.d,new.e,new.f);
END IF;
END
|
delimiter ;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值