mysql触发器记录

一张表t1,两个字段,id和name字段,要实现一个功能,在往这张表里面插入数据的时候,如果表中有与插入的数据name字段相同的字段,则更新id字段,
之前没写过,不过大概记得以前学习mssql的时候有个东西可以早对表进行inser update delete的时候触发一些动作
下面是代码:

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 ;

标签: none

添加新评论