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了

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


猜你喜欢

转载自blog.csdn.net/arcprodrelhh/article/details/78221269