当前位置:文档之家› mysql 触发器使用实例

mysql 触发器使用实例

mysql 触发器使用实例(修改一个表内容的同时另一个表内容自动变化)[分享]触发器小例子触发器能进行一些约束.这是个小例子,当Student表的StudentID列被发生更改时,BorrowStudent表的StudentID列也跟着更改.如果Student表删除某记录,BorrowStudent也删除对应StudentID的记录./*先删除将要创建而存在的表*/drop table if exists Student;drop table if exists BorrowStudent;/*创建表*/create table Student(StudentID int not null primary key,StudentName varchar(30) not null,StudentSex enum('m','f') default 'm')engine=myisam;create table BorrowStudent(BorrowRecord int not null auto_increment primary key,StudentID int not null,BorrorDate date,ReturnDate date,foreign key(StudentID) references Student(StudentID))engine=myisam;/*插入记录*/insert into Student values(1235412,'java','m');insert into Student values(3214562,'jiajia','m');insert into Student values(5441253,'purana','f');insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)values(1235412,'2007-01-01','2007-01-07');insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)values(3214562,'2007-01-01','2007-01-07');insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)values(5441253,'2007-01-01','2007-01-07');/*创建触发器*/delimiter $$drop trigger if exists tduStudent$$drop trigger if exists tddStudent$$create trigger tduStudent before updateon Student for each rowbeginif new.StudentID!=old.StudentID thenupdate BorrowStudentset BorrowStudent.StudentID=new.StudentIDwhere BorrowStudent.StudentID=old.StudentID;end if;end$$create trigger tddStudent before deleteon Student for each rowbegindeletefrom BorrowStudentwhere BorrowStudent.StudentID=old.StudentID;end$$delimiter ;待完善~转载于:/u1/50685/showart_1935390.html下面是在网上找的一个比较好的教程~~ 供学习每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。

在这里举个例子:mysql> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)如果实例比较大,则需要在某些行和段落间加注释,同时我会用将"<--"符号放在页面的右边以表示强调。

例如:mysql> CREATE PROCEDURE p ()-> BEGIN-> /* This procedure does nothing */ <---> END;//Query OK, 0 rows affected (0.00 sec)有时候我会将例子中的"mysql>"和"->"这些系统显示去掉,你可以直接将代码复制到mysql客户端程序中(如果你现在所读的不是电子版的,可以在网站下载相关脚本)所以的例子都已经在Suse 9.2 Linux、Mysql 5.0.3公共版上测试通过。

在您阅读本书的时候,Mysql已经有更高的版本,同时能支持更多OS了,包括Windows,Sparc,HP-UX。

因此这里的例子将能正常的运行在您的电脑上。

但如果运行仍然出现故障,可以咨询你认识的资深Mysql用户,这样就能得到比较好的支持和帮助。

为什么要用触发器我们在MySQL 5.0中包含对触发器的支持是由于以下原因:MySQL早期版本的用户长期有需要触发器的要求。

我们曾经许诺支持所有ANSI标准的特性。

您可以使用它来检查或预防坏的数据进入数据库。

您可以改变或者取消INSERT, UPDATE以及DELETE语句。

您可以在一个会话中监视数据改变的动作。

在这里我假定大家都读过"MySQL新特性"丛书的第一集--"MySQL存储过程",那么大家都应该知道MySQL至此存储过程和函数,那是很重要的知识,因为在触发器中你可以使用在函数中使用的语句。

特别举个例子:复合语句(BEGIN / END)是合法的.流控制(Flow-of-control)语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.变量声明(DECLARE)以及指派(SET)是合法的.允许条件声明.异常处理声明也是允许的.但是在这里要记住函数有受限条件:不能在函数中访问表.因此在函数中使用以下语句是非法的。

ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETEDROP 'FLUSH PRIVILEGES' GRANT INSERT KILLLOCK OPTIMIZE REPAIR REPLACE REVOKEROLLBACK SAVEPOINT 'SELECT FROM table''SET system variable' 'SET TRANSACTION'SHOW 'START TRANSACTION' TRUNCATE UPDATE在触发器中也有完全一样的限制.触发器相对而言比较新,因此会有(bugs)缺陷.所以我在这里给大家警告,就像我在存储过程书中所说那样.不要在含有重要数据的数据库中使用这个触发器,如果需要的话在一些以测试为目的的数据库上使用,同时在你对表创建触发器时确认这些数据库是默认的。

语法1. 语法:命名规则CREATE TRIGGER <触发器名称> <--{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW<触发器SQL语句>触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.这里我有个习惯:就是用表的名字+'_'+触发器类型的缩写.因此如果是表t26,触发器是在事件UPDATE(参考下面的点(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu。

2. 语法:触发时间CREATE TRIGGER <触发器名称>{ BEFORE | AFTER } <--{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW<触发的SQL语句>触发器有执行的时间设置:可以设置为事件发生前或后。

3. 语法:事件CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE } <--ON <表名称>FOR EACH ROW<触发的SQL语句>同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。

4. 语法:表CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称> <--FOR EACH ROW<触发的SQL语句>触发器是属于某一个表的:当在这个表上执行插入、更新或删除操作的时候就导致触发器的激活.我们不能给同一张表的同一个事件安排两个触发器。

5. 语法:(步长)触发间隔CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW <--<触发的SQL语句>触发器的执行间隔:FOR EACH ROW子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。

6. 语法:语句CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW<触发的SQL语句> <--触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句,包括复合语句,但是这里的语句受的限制和函数的一样。

相关主题