mysql 的触发器(不适合初学者)

mysql触发器

作用:触发程序视为单一交易中的一部份,因此可以由原触发程序还原交易,如果在交易过程中侦测到严重的错误(如使用者中断连线),则会自动还原整个交易。可以保重数据的完整性

SECOND_触发器语法

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt .
不能将触发程序与TEMPORARY表或视图关联起来。
1_用户表user
CREATE TABLE `user` (
`id` int ( 11 ) NOT NULL auto_increment COMMENT ' 用户 ID' ,
`name` varchar ( 50 ) NOT NULL default '' COMMENT ' 名称 ' ,
`sex` int ( 1 ) NOT NULL default '0' COMMENT '0 为男, 1 为女 ' ,
PRIMARY KEY ( `id` )
) ENGINE =MyISAM DEFAULT CHARSET =utf8 ;

INSERT INTO `user` ( `id` , `name` , `sex` ) VALUES
( 1 , ' 张映 ' , 0 ),
( 2 , 'tank' , 0 );

2_ 评论表 comment
CREATE TABLE `comment` (
`c_id` int ( 11 ) NOT NULL auto_increment COMMENT ' 评论 ID' ,
`u_id` int ( 11 ) NOT NULL COMMENT ' 用户 ID' ,
`name` varchar ( 50 ) NOT NULL default '' COMMENT ' 用户名称 ' ,
`content` varchar ( 1000 ) NOT NULL default '' COMMENT ' 评论内容 ' ,
PRIMARY KEY ( `c_id` )
) ENGINE =MyISAM DEFAULT CHARSET =utf8 ;

INSERT INTO `comment` ( `c_id` , `u_id` , `name` , `content` ) VALUES
( 1 , 1 , ' 张映 ' , ' 触发器测试 ' ),
( 2 , 1 , ' 张映 ' , ' 解决字段冗余 ' ),
( 3 , 2 , 'tank' , ' 使代码更简单 ' );

FIRST_需求:::::::::::::

更新user表的name时,触发器同时更新comment表,就不要写php代码去更新了,当用户被删除时,comment表中,有关该用户的数据将被删除

触发器语法::
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt .
delimiter || -- 分号的意思
drop trigger if exists triggername|| -- 删除同名的触发器,
create trigger updatename after update on user for each row -- 建立触发器,
begin
-- old,new 都是代表当前操作的记录行,你把它当成表名,也行 ;
if new. name !=old. name then -- 当表中用户名称发生变化时 , 执行
update comment set comment . name =new. name where comment . u_id =old. id ;
end if ;
end ||
delimiter ;

delimiter ||
drop trigger if exists deletecomment||
create trigger deletecomment before delete on user for each row -- 在删除任意一行 user 记录时建立触发器
begin
delete from comment where comment . u_id =old. id ;
end ||
delimiter ;

测试 ;
update user set name='苍鹰'  where id = 1; -- comment 表中的name需要改变
答案 :改变
删除触发器
drop   trigger   trigger_name ;
测试
update user set name = ' 删除触发 ' where id = 1 ;
发现 comment 表中u_id=1 的记录的name并没有改变!
1,触发器的"自动性"
对程序员来说,触发器是看不到的,但是他的确做事情了,
2,触发器的数据完整性 回滚性
触发器有回滚性,举个例子,更新五张表的数据,不会出现更新了二个张表,而另外三张表没有更新。但是如果是用程序代码去写的话,就有可能出现这种情况的,比如你更新了二张表的数据,这个时候,数据库挂掉了。你就郁闷了,有的更新了,有的没更新。这样页面显示不一致了,变有bug了

最后感谢大家阅读,欢迎大家留言讨论!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值