有一个雇员表:工龄字段,工资表。
当修改工龄时,每增加一年,相应的工资涨200元。
create table emp
(id int primary key,
name varchar(8),
workyear int);
create table gz
(id int primary key,
salary int);
insert into emp values(101,'a',5);
insert into emp values(102,'b',8);
insert into emp values(103,'c',15);
insert into gz values(101,2300);
insert into gz values(102,3000);
insert into gz values(103,4500);
create trigger emp_update after update
on emp for each row
begin
declare years int;
set years=new.workyear -old.workyear;
if years>0 then
update gz set salary=salary+years*200 where id=new.id;
end if;
end
update emp set workyear =10 where id=101;
触发器可以认为是特殊存储过程。
但与存储过程不同:
1.调用方式不同:存储过程 call 通过名字调用
触发器:通过事件激活 insert update delete
2.存储过程是数据库里的对象,在库上的。
触发器是在表上的。
创建触发器:
create trigger 触发器名 [after|before] [insert|updat|delete]
on 表名 for each row
begin
触发器语句内容
end
after: 触发器是在触发语句执行后才执行
before:触发器是在触发语句之前执行
create table table1(a int);
create trigger table1_insert after insert
on table1 for each row
begin
set @str='Trigger is working';
end
insert into table1 values(1);
select @str
insert: 插入的新数据可以通过 new.字段名 来引用。
update :更新前的值可以通过 old.字段名引用, 更新后的值可以通过 new.字段名引用
delete :通过 old.字段名 获取删除的旧数据。
create table test1(id int primary key,
name varchar(8),
dept varchar(20));
create trigger test1_insert after insert
on test1 for each row
begin
set @id=new.id;
set @name=new.name;
set @dept=new .dept;
end
create trigger test1_update after update
on test1 for each row
begin
set @oid=old.id;
set @oname=old.name;
set @odept=old.dept;
set @nid=new.id;
set @nname=new.name;
set @ndept=new .dept;
end
创建触发器的思路:
1.考虑在哪个表上创建触发器,由什么事件触发。
2.根据触发事件,去找相应的数据。到old,new中找,相关表
3.进行相应的处理。
create trigger xs_delete after delete
on xs for each row
begin
delete from xs_kc where 学号=old.学号;
end
delete from xs where 学号='081101';
有两个结构一样的表,test1,test2,
要求当向test1表中插入一条数据时,
将相应的数据插入到test2表中。
create trigger test1_insert1 after insert
on test1 for each row
begin
insert into test2 values(new.id,new.name,new.dept);
end
create trigger xs_kc_update before update
on xs_kc for each row
begin
declare xf int;
select 学分 into xf from kc where 课程号=new.课程号;
if new.成绩<60 then
set new.学分=0;
else
set new.学分=xf;
end if;
end
update xs_kc set 成绩=90 where 学号='XX' and 课程号='xx';
旧数据:old.学号 old.课程号 old.成绩 old.学分
新数据:new.学号 new.课程号 new.成绩 new.学分
作业答案
create function f_birthday(xh char(6))
returns char(10)
begin
if (select 专业名 from xs where 学号=xh)='计算机' then
return (select 出生日期 from xs where 学号=xh);
else
return 'false';
end if;
end
create function f_birthday1(xh char(6))
returns char(10)
begin
declare zym char(10);
declare aa int;
select 专业名 into zym from xs where 学号=xh;
select strcmp(zyn,'计算机') into aa;
if aa=0 then
return (select 出生日期 from xs where 学号=xh);
else
return 'false';
end if;
end
create function f_birthday2(xh char(6))
returns char(10)
begin
declare xm char(10);
select 姓名 into xm from xs where 学号=xh and 专业名='计算机';
if xm is not null then
return (select 出生日期 from xs where 学号=xh);
else
return 'false';
end if;
end