做个题就会的知识,mysql触发器例题及答案(二)

我会连续用一两个表,陆续出一些题目,同时也会给出答案,题目一般含有视图触发器,函数,存储过程

触发器例题:

再有一个富豪榜,和一个平民榜,有id、姓名和身价
当有一个平民创业成功晋级为富豪时(拥有50身价)
但是突然你拥有了200身价那么怀疑你金钱来路不明,抛出异常
你应该创建一个触发器,实现这个功能

语法:

create trigger 触发器名 before|after 触发事件  
#触发事件指:insert(有new) update(有new,old) delete(有old)
on 表名 for each row
begin
    执行语句列表,可以存在多条sql语句,或逻辑语句
end

如果不了解语法的含义,看我的另一篇文章:
触发器语法讲解

答案:

尽量自己做下^_^

创建富豪表

create table wealthy(
id int primary key auto_increment,
age int,
name varchar(20),
money int);

插入需要的数据

insert into wealthy values(1,20,'张三',110);
insert into wealthy values(2,35,'李四',110);
insert into wealthy values(3,35,'王五',90);
insert into wealthy values(4,20,'赵六',90);

创建平民表

create table person(
id int primary key auto_increment,
age int,
name varchar(20),
money int);

插入需要的数据

insert into person values(0,20,'十一',30);

创建视图

delimiter $$
create trigger person_trigger_update_after after update
on person for each row
begin
if new.money>200 then
signal sqlstate 'HY000' set message_text='error money';
elseif new.money>50 then
insert into wealthy values(0,old.age,old.name,new.money);
end if;
end;
$$
delimiter ;

当更新大于200时

update person
set money = 210
where id=1;
报错
ERROR 1644 (HY000): error money

当更新大于50时

update person
set money = 80
where id=1;

查看富豪表

select * from wealthy;

查看触发器

show triggers \G;

删除触发器

drop trigger person_trigger_update_after;

试着思考一下如果你不要old和new会发生什么

delimiter $$
create trigger person_trigger_update_after after update
on person for each row
begin
if new.money>200 then
signal sqlstate 'HY000' set message_text='error money';
elseif new.money>50 then
insert into wealthy values(0,age,name,new.money);
end if;
end;
$$
delimiter ;

结果:数据在插入富豪榜后会显示null,因为不传则默认为null

这里我们知道了,平民表的数据并没有删除,还有数据残留
思考:如果我需要知道他是白手起家还是富二代,
那么数据就要保存着 (平民表有的数据就是白手起家)
所以为了保证数据一致,那么一个表改了另一个表也要改,
如何实现?
再思考:如果我们不需要这个数据了该怎么删除,
已知触发器不能对本表进行增删改,会死循环,那么如何实现

你可能感兴趣的:(数据库)