[分享]触发器小例子
触发器能进行一些约束.<br>这是个小例子,当Student表的StudentID列被发生更改时,BorrowStudent表的StudentID列也跟着更改.如果Student表删除某记录,BorrowStudent也删除对应StudentID的记录.<br><br>/*先删除将要创建而存在的表*/<br>drop table if exists Student;<br>drop table if exists BorrowStudent;<br><br>/*创建表*/<br>create table Student(<br> StudentID int not null primary key,<br> StudentName varchar(30) not null,<br> StudentSex enum('m','f') default 'm'<br>)engine=myisam;<br><br>create table BorrowStudent(<br> BorrowRecord int not null auto_increment primary key,<br> StudentID int not null,<br> BorrorDate date,<br> ReturnDate date,<br> foreign key(StudentID) references Student(StudentID)<br>)engine=myisam;<br><br>/*插入记录*/<br>insert into Student values(1235412,'java','m');<br>insert into Student values(3214562,'jiajia','m');<br>insert into Student values(5441253,'purana','f');<br><br>insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)<br> values(1235412,'2007-01-01','2007-01-07');<br>insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)<br> values(3214562,'2007-01-01','2007-01-07');<br>insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)<br> values(5441253,'2007-01-01','2007-01-07');<br><br>/*创建触发器*/<br>delimiter $$<br>drop trigger if exists tduStudent$$<br>drop trigger if exists tddStudent$$<br>create trigger tduStudent before update<br>on Student for each row<br>begin<br> if new.StudentID!=old.StudentID then<br> update BorrowStudent<br> set BorrowStudent.StudentID=new.StudentID<br> where BorrowStudent.StudentID=old.StudentID;<br> end if;<br>end$$<br><br>create trigger tddStudent before delete<br>on Student for each row<br>begin<br> delete<br> from BorrowStudent<br> where BorrowStudent.StudentID=old.StudentID;<br>end$$<br>delimiter ;<br><P><br><br> </P>
[align=right][color=#000066][此贴子已经被作者于2007-9-10 12:20:24编辑过][/color][/align]
上面是sql server中的写法,mysql中怎么写 呢? 你为Table添加触发器.<br>又用update来更新同一Table?<br>mysql的触发器不行.<br>因为mysql的触发器.还是不怎么成熟的.<br><br>如果你想这么做.那只有用set new.field_name=value 这样的来做.<br> 按照你的要求,写了一个.<br>drop table if exists tbl_temp;<br>create table tbl_temp(<br> id int not null auto_increment key,<br> field_a int,<br> field_b int,<br> field_c int<br>)engine=myisam;<br><br>insert into tbl_temp(field_a,field_b,field_c) values(2,3,2);<br>insert into tbl_temp(field_a,field_b,field_c) values(1,2,3);<br>insert into tbl_temp(field_a,field_b,field_c) values(0,0,0);<br><br>delimiter $$<br>drop trigger if exists tr_set$$<br>create trigger tr_set before update<br>on tbl_temp for each row<br>begin<br> if new.field_a=1&&new.field_b=1 then<br> set new.field_c=1;<br> end if;<br>end$$<br>delimiter ;<br> 恩,不错,以后应该用点触发器...<BR>斑竹我还有一个问题:比如我们在建表时经常要用到check约束,但Mysql的视图却不支持CHECK约束,但我们能不能用触发器实现下列表中的CHECK约束呢?<BR>CREATE TABLE t25 (s1 INT, s2 CHAR(5), PRIMARY KEY (s1), CHECK (LEFT(s2,1)='A')) ENGINE=INNODB; <BR>这里CHECK的意思是"当s2列的最左边的字符不是'A'时,insert和update语句都会非法"。<BR> 视图?.<br>但你的是创建表哦?.<br>mysql也可以check.只不过基本是没用的.[em02]<br><br>这种情况.那就在客户端里判断了.<br> <P>我想用触发器实现,我刚才试着写了一个,在DOS环境下一运行就卡住了,是不是有bug呀?而在mysqlcc中验证此触发器的功能时可以达到要求,不知道是什么原因?[em06]<br>delimiter $$<br>create trigger t25_bi before insert<br>on t25 for each row<br>begin<br> if left(new.s2,1)<>'a' then set new.s1=0;<br> end if;<br>end$$<br>delimiter ;<br>我建立的表如下:<br>create table t25(s1 int,s2 char(5))engine=innodb;<br></P>
[align=right][color=#000066][此贴子已经被作者于2007-9-10 16:56:52编辑过][/color][/align]
我这里可以.<br>
页:
[1]
