数据库

数据库教程-数据库触发器创建例子

位置:首页 > 数据库 > SQL Server,2012-06-08
数据库教程-数据库触发器创建例子,触发器使用教程#第一部分准备#1、建立数据库dropdatabaseifexistsjsj10trigger;createdatabaseifnotexistsjsj...

数据库教程-数据库触发器创建例子,触发器使用教程

#第一部分 准备

 

#1、建立数据库

drop database if exists jsj10trigger;

create database if not exists jsj10trigger;

use jsj10Trigger; #--选择数据库

 

#2、建立系表

drop table if exists 系;

CREATE TABLE if not exists 系 

( 系号 char(10),# constraint 系_主键 primary key,

  系名 char(20),

  系主任名 char(10),

  电话 char(12),

  constraint 系_主键_系号 primary key(系号)

);

 

#3、建立教师表

Drop table if exists 教师;

CREATE TABLE if not exists 教师 #--新建“教师”表

( 职工号 char(10), #constraint 教师_主键 primary key,

  姓名 char(10),

  年龄 int check(年龄<=60),

  职称 char(9),

  工资 numeric(7,2),

  系号 char(10), 

  constraint  教师_主键 primary key(职工号),

  constraint  教师_外键 foreign key(系号) references 系(系号)

);

 

#删除教师表外键。修改表.删除外键约束教师_外键

#ALTER TABLE 教师   

#DROP FOREIGN KEY 教师_外键;

 

#4、建立工资变化表

 

Drop table if exists 工资变化;

CREATE TABLE if not exists 工资变化 #--新建“工资变化表”

( 职工号 char(10) ,

  姓名 char(10),

  工资 numeric(7,2),

  用户 char(30),

  日期 datetime, #--timestamp  --- SELECT CURRENT_TIMESTAMP

  #日期 timestamp  --- SELECT CURRENT_TIMESTAMP如果使用timestamp数据类型,在插入记录时,此属性值系统自动赋值?

  constraint 工资变化_外键 foreign key(职工号) references 教师(职工号) 

    on delete cascade  on update cascade

);

 

 

#删除工资变化表的外键:工资变化_外键

#ALTER TABLE 工资变化   #--修改表.删除外键约束教师_外键

#DROP FOREIGN KEY  工资变化_外键  ;

 

#5、建立表:工资变化_t

Drop table if exists 工资变化_t;

CREATE TABLE if not exists 工资变化_t 

( 职工号 char(10),# constraint 工资变化_t_外键 references 教师(职工号) ,

  姓名 char(10),

  工资 numeric(7,2),

  用户 char(30),

  日期 datetime,# --timestamp  --- SELECT CURRENT_TIMESTAMP

  constraint 工资变化_t_外键 foreign key(职工号) references 教师(职工号) 

    on delete cascade  on update cascade

#--日期 timestamp  --- SELECT CURRENT_TIMESTAMP如果使用timestamp数据类型,在插入记录时,此属性值系统自动赋值?

);

 

#删除工资变化表_t的外键

#ALTER TABLE 工资变化_t  # --修改表.删除外键约束教师_外键

#DROP foreign key 工资变化_t_外键   ;

 

 

use jsj10trigger;

delete  from 教师;

delete  from 系;#--如果先删除部门后删除职工系统会出错

insert into 系 values("001","计算机系","计算机许主任","82780001");

insert into 系 values("002","化工系","化工系吴主任","82780002");

insert into 系 values("003",'土木系','土木系林主任','82780003');

 

Insert into 教师 values("1001","陈日","32","教授","50000","001");

Insert into 教师 values('1002','吴新','31','教授','50000','002');

Insert into 教师 values('1003','李月','36','教授','60000','003');

Insert into 教师 values('1004','陈毅','34','副教授','10000','003');

Insert into 教师 values('1005','王虎','29','讲师','5000','001');

 

select * from 系;

select * from 教师;

 

#第二部分P162例18、例19

 

/*例18(P162)

  定义一个before行级触发器,为教师表定义完整性规则“教授工资不得低于4000元,

  如果低于4000元,自动改为4000元”

*/

 

drop trigger if exists trigger_teacher_before_insert;

 

DELIMITER | #将触发器的语句结束符定义为|或&&。默认的";"在触发器中用到

create trigger trigger_teacher_before_insert 

before insert #or update 特别注意:MySQL中几个事件不能同时定义在一个触发器中

on 教师

for each row

begin

  if new.职称="教授" and new.工资<4000 

   then  set new.工资=4000;#注意:在MySQL中赋值语句需要由set引出

  end if;

end|

DELIMITER ;

 

 

drop trigger if exists trigger_teacher_before_update ;

 

DELIMITER && #将触发器的语句结束符定义为|或&&。默认的";"在触发器中用到

create trigger trigger_teacher_before_update 

before update #or update 特别注意:MySQL中几个事件不能同时定义在一个触发器中

on 教师

for each row

begin

  if new.职称="教授" and new.工资<4000 

   then  set new.工资=4000;#注意:在MySQL中赋值语句需要由set引出

  end if;

end&&

DELIMITER ;

 

/*#例验证

  将教授(职工号1003)工资改为2000(触发器自动将工资置为4000)

  将副教授(职工号1004)工资改为1000(触发器没有将工资置为4000)

*/

#验证修改

select * from 教师;

update 教师 set 工资=2000 where 职工号="1003";#职称='教授';

update 教师 set 工资=1000 where 职工号="1004";#职称="副教授";

select * from 教师;

#验证插入

select * from 教师;

delete from 教师 where 职工号="1006";

insert into 教师 values('1006','陈日','32','教授','2000','001');

select * from 教师;

 

/*

delimiter &&

CREATE TRIGGER upd_check BEFORE UPDATE ON account

FOR EACH ROW

BEGIN

  IF NEW.amount < 0 THEN

    SET NEW.amount = 0;

  ELSEIF NEW.amount > 100 THEN

         SET NEW.amount = 100;

  END IF;

END&&

delimiter ;

*/

 

/*

DELIMITER | 

CREATE TRIGGER testref 

BEFORE INSERT ON test1  

FOR EACH ROW 

BEGIN    

  INSERT INTO test2 SET a2 = NEW.a1;    

  DELETE FROM test3 WHERE a3 = NEW.a1;      

  UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;  

END| 

DELIMITER ;

*/

 

/*例19(P162)

  *定义一个after行级触发器,当教师的工资发生变化后自动在工资变化表中增加一条相应的记录

  *在MYSQL中获取当前时间函数:

    **NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。

    **CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。

    **CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。

   例:insert into tablename (fieldname) values (now())

*/

select current_user;     #结果显示格式:root@localhost

select current_timestamp;#结果显示格式: 2012-04-04 12:21:00;

select curdate();        #结果显示格式:2012-04-04

select now(),curtime();   #结果显示格式: now()为2012-04-04 12:22:24, curtime为12:22:24

 

#定义after insert触发器

drop trigger if exists trigger_teacher_after_insert;

delimiter &&

create trigger trigger_teacher_after_insert

after insert

on 教师

for each row

begin

  insert into 工资变化(职工号,姓名,工资,用户,日期)

   values(new.职工号,new.姓名,new.工资,current_user,now());

end&&

delimiter ; #注:中间空格不能少

 

#验证插入

select * from 教师;

delete from 教师 where 职工号="1006";#需要在工资变化表中外键定义定义成级联删除与修改

insert into 教师 values('1006','陈日','32','教授','2000','001');

select * from 教师;

select * from 工资变化;

 

#定义after update触发器

drop trigger if exists trigger_teacher_after_update;

delimiter &&

create trigger trigger_teacher_after_update

after update

on 教师

for each row

begin

  if (new.工资<>old.工资) then 

    insert into 工资变化(职工号,姓名,工资,用户,日期)

       values(new.职工号,new.姓名,new.工资,current_user,now());

   end if;

end&&

delimiter ; #注:中间空格不能少

 

#验证修改

select * from 教师;

update 教师 set 工资=6000 where 职工号="1001";#需要在工资变化表中外键定义定义成级联删除与修改

update 教师 set 工资=2000 where 职工号="1001";

select * from 教师;

select * from 工资变化;

 

ab蓝学网,最全js网页特效代码,广告图片切换|图片轮播代码,推出数据库教程,手机网站 android开发教程|企业网站推广方法技巧,也提供免费网站模板下载.

TAGS:数据库教程-数据库触发器创建例子触发器使用教程

猜你喜欢

NewHot