mysql 触发器详解 代码 错语解答
2013-01-25 20:55
197 查看
触发器trigger
作用:可以监视 增删改操作 并触发 增删改操作
监视对象:TALBE表 监视事件:insert update delete 触发时间:
after before 触发事件 insert update delete
万能模版:
创建触发器
create trigger 触发器名称
after/before insert/update/delete on 表名
for each row
begin
sql 语句—一个或者多个语句范围在 insert/update/delete内;
end
如果只有一条SQL语句,可以不用begin end 。直接后面接上就行。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
还有就是在触发器中使用变量
[sql] view
plaincopyprint?
set @t_id=new.id;
set @t_id=old.id;
new可以或则到你新添加进来的数据 old其实也可以 但是在old只可以在update中使用
Before与After区别:before:(insert、update)可以对new进行修改,after不能对new进行修改。两者都不能修改old数据。
在本表插入字段值需要用new计算,只能用before,在别的表中记录插入成功记录或统计插入的条数用after。
变量的话,无论Before,After都可以用。
定义变理有两种方式:
一:declare t_id int(10);//先申明
set t_id= new.ID;
二:set @t_name= 'P_Business';;//不事先申明,直接创建
第一种方式不推荐。实验证明,变量值只能被附于更大的值,而不能被附于更小的值,有时候还会有幻值。我也不知道这是怎么回事。但用@定义的值就没有这样的问题。
变理可以附于常量,也可以直接附给结果:
SET @ver = (SELECT VERSION FROM zf_cnc_conference.userinfo WHERE username=new.MobileNum);
还可以更复杂一些:
SET @new_version=(SELECT IFNULL(@ver,0)) ;
INSERT INTO zf_cnc_conference.userinfo
(organizerID,
username,
email,
mobile,
telephone,
createDate,
sipName,
sipNum,
sipPwd,
VERSION
)
VALUES
( new.organizerID,
new.MobileNum,
'',
new.MobileNum,
new.MobileNum,
new.CreateTime,
new.sipName,
new.sipNum,
new.sipPwd,
@new_version
);
变量中NEW的用法,NEW只能搭配before用,作用是从提交上来的SQL语句中调取字段中的内容。比如:set @t_id= new.ID;SQL语句中的ID值会被提取出来,赋值给变量t_id。
需要注意以下几点:
1.MySQL触发器针对行来操作,因此当处理大数据集的时候可能效率很低。
2.触发器不能保证原子性,例如在MYISAM中,当一个更新触发器在更新一个表后,触发对另外一个表的更新,若触发器失败,不会回滚第一个表的更新。InnoDB中的
触发器和操作则是在一个事务中完成,是原子操作。
作用:可以监视 增删改操作 并触发 增删改操作
监视对象:TALBE表 监视事件:insert update delete 触发时间:
after before 触发事件 insert update delete
万能模版:
创建触发器
create trigger 触发器名称
after/before insert/update/delete on 表名
for each row
begin
sql 语句—一个或者多个语句范围在 insert/update/delete内;
end
如果只有一条SQL语句,可以不用begin end 。直接后面接上就行。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
还有就是在触发器中使用变量
[sql] view
plaincopyprint?
set @t_id=new.id;
set @t_id=old.id;
new可以或则到你新添加进来的数据 old其实也可以 但是在old只可以在update中使用
Before与After区别:before:(insert、update)可以对new进行修改,after不能对new进行修改。两者都不能修改old数据。
在本表插入字段值需要用new计算,只能用before,在别的表中记录插入成功记录或统计插入的条数用after。
变量的话,无论Before,After都可以用。
定义变理有两种方式:
一:declare t_id int(10);//先申明
set t_id= new.ID;
二:set @t_name= 'P_Business';;//不事先申明,直接创建
第一种方式不推荐。实验证明,变量值只能被附于更大的值,而不能被附于更小的值,有时候还会有幻值。我也不知道这是怎么回事。但用@定义的值就没有这样的问题。
变理可以附于常量,也可以直接附给结果:
SET @ver = (SELECT VERSION FROM zf_cnc_conference.userinfo WHERE username=new.MobileNum);
还可以更复杂一些:
SET @new_version=(SELECT IFNULL(@ver,0)) ;
INSERT INTO zf_cnc_conference.userinfo
(organizerID,
username,
email,
mobile,
telephone,
createDate,
sipName,
sipNum,
sipPwd,
VERSION
)
VALUES
( new.organizerID,
new.MobileNum,
'',
new.MobileNum,
new.MobileNum,
new.CreateTime,
new.sipName,
new.sipNum,
new.sipPwd,
@new_version
);
变量中NEW的用法,NEW只能搭配before用,作用是从提交上来的SQL语句中调取字段中的内容。比如:set @t_id= new.ID;SQL语句中的ID值会被提取出来,赋值给变量t_id。
需要注意以下几点:
1.MySQL触发器针对行来操作,因此当处理大数据集的时候可能效率很低。
2.触发器不能保证原子性,例如在MYISAM中,当一个更新触发器在更新一个表后,触发对另外一个表的更新,若触发器失败,不会回滚第一个表的更新。InnoDB中的
触发器和操作则是在一个事务中完成,是原子操作。
相关文章推荐
- mysql 触发器详解 代码 错语解答
- mysql 触发器用法实例详解
- mysql中触发器的使用详解
- MySQL 复制表详解及实例代码
- MySQL触发器使用详解
- php+mysql分页代码详解
- MySQL通过触发器解决数据库中表的行数限制详解及实例
- MySQL 序列 AUTO_INCREMENT详解及实例代码
- MySQL之触发器详解
- 如果公司里有上百个表要做触发器,如果手动写代码的话。很累,所以今天写了一个小程序,自动生成mysql的触发代码。
- MySQL触发器使用详解
- mysql触发器详解 mysql触发器
- MySQL触发器使用详解
- [转]mysql 利用触发器(Trigger)让代码更简单
- php mysql insert into 结合详解及实例代码
- Mysql事项,视图,函数,触发器命令(详解)
- MySQL触发器使用详解
- MySQL触发器使用详解
- mysql触发器new old 详解 真实例子
- php+mysql分页代码详解