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了
最后感谢大家阅读,欢迎大家留言讨论!