purana 发表于 2007-9-10 09:45

[分享]触发器小例子

触发器能进行一些约束.<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>

静思 发表于 2007-9-10 12:19

<P>以前对触发器不太明白,也不太经常用,看了版主这个帖子之后,感觉自己明白了点...<br>下面是我写的一个例子,不知道是不是这样写的,要完成的功能是:当表中a,b 两列的值同时为1的时候 同表中的另一列c 的值 自动设成1 <br><br><br>CREATE TRIGGER tr_TABLE_Update ON TABLE <br>FOR UPDATE <br>AS <br>BEGIN <br>DECLARE @A INT <br>,@B INT <br>,@ID INT <br>SELECT @ID=ID, @A=A, @B=B FROM INSERTED <br>IF @A=@B=1 <br>BEGIN <br>UPDATE TABLE SET C=1 WHERE ID = @ID <br>END <br>END </P>
<P><br><br> </P>
[align=right][color=#000066][此贴子已经被作者于2007-9-10 12:20:24编辑过][/color][/align]

静思 发表于 2007-9-10 12:31

上面是sql server中的写法,mysql中怎么写 呢?

purana 发表于 2007-9-10 14:31

你为Table添加触发器.<br>又用update来更新同一Table?<br>mysql的触发器不行.<br>因为mysql的触发器.还是不怎么成熟的.<br><br>如果你想这么做.那只有用set new.field_name=value 这样的来做.<br>

purana 发表于 2007-9-10 14:46

按照你的要求,写了一个.<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&amp;&amp;new.field_b=1 then<br>       set new.field_c=1;<br>    end if;<br>end$$<br>delimiter ;<br>

静思 发表于 2007-9-10 15:32

恩,不错,以后应该用点触发器...<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>

purana 发表于 2007-9-10 16:24

视图?.<br>但你的是创建表哦?.<br>mysql也可以check.只不过基本是没用的.[em02]<br><br>这种情况.那就在客户端里判断了.<br>

静思 发表于 2007-9-10 16:48

<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)&lt;&gt;'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]

purana 发表于 2007-9-10 17:52

我这里可以.<br>

页: [1]

编程论坛