触发器练习

文章展示了如何在数据库中创建和使用触发器,如在用户表插入数据时自动记录日志,以及模拟ATM取款操作。此外,还讨论了游标的使用,包括数据提取和处理,并定义了相关存储过程。最后,提到了触发器在学生和成绩管理中的应用,如学生删除时删除对应成绩,课程号更新时同步成绩表。
摘要由CSDN通过智能技术生成

-- 创建触发器,实现:当在users插入一条数据,就会在log中生成一条日志信息。
create trigger mytg1
after insert on `user`
for each row
begin
INSERT into log VALUES(null,'数据更新了');
end;
INSERT INTO `user` VALUES(NULL,'张强',NOW());
-- 删除触发器
drop trigger if exists mytg1;
-- 查看触发器
SHOW TRIGGERS;
-- 每当你在ATM机取钱的时候,银行系统都有什么操作.判断银行卡是否有钱,如果有钱就从银行卡中转出你提取到个人账户的钱,如果没有就提示没有这么多的钱
-- 只有余额+—最大值。
-- 请自己设计表和触发器,模拟取款操作,查看各个表中数据的变化
-- 创建before触发器
CREATE TRIGGER mytg1
BEFORE INSERT ON personmeney
FOR EACH ROW
BEGIN
    DECLARE n INT DEFAULT 0;
    -- 查看银行卡里是否有足够的钱
SELECT money INTO n FROM car WHERE  id=new.id;
if new.money>n THEN-- 条件开始
SET new.money=n;
END IF;-- 条件结束
UPDATE car SET money=money-new.money WHERE id=new.id;
END;
-- 往个人金额里插入记录
INSERT INTO personmeney VALUES (null,1,10);
-- 查看银行卡金额更新情况
SELECT *FROM car;
-- 查看个人金额
SELECT *FROM personmeney;
-- 课本游标案例
-- 定义过程
create PROCEDURE p1()
BEGIN
declare id int;
declare name varchar(20);
declare age int;
-- 声明游标
declare mc cursor for select * from student;
-- 打开游标
open mc;
-- 提取结果
FETCH mc into id,name,age;
-- 显示获取的结果
select id,name,age;
close mc;
end;
-- 调用过程
call p1()
-- 定义过程
create PROCEDURE p2()
BEGIN
declare id int;
declare name varchar(20);
declare age int;
-- 声明游标
declare mc cursor for select * from student;
-- 打开游标
open mc;
-- 提取结果
loop -- 循环提取数据
FETCH mc into id,name,age;
-- 将提取的每一行数据插入到 student2 表中
insert into student2 values(id,name,age);
end loop;
close mc;
end;
-- 调用过程
call p2();
-- 查询 student2 表
select * from student2;
-- 定义过程
create PROCEDURE p2()
BEGIN
declare id int;
declare name varchar(20);
declare age int;
declare flag int default 0;
-- 声明游标
declare mc cursor for select * from student;
declare continue handler for not found set flag = 1;
-- 打开游标
open mc;
-- 提取结果
a:loop -- 循环提取数据
FETCH mc into id,name,age;
if flag=1 THEN -- 当无法 fetch 时触发 continue handler
leave a;
end if;
-- 将提取的每一行数据插入到 student2 表中
insert into student2 values(id,name,age);
end loop;
close mc;
end;
-- 删除某个学生时,对应该学生的全部成绩一并删除
CREATE trigger mytg1
AFTER DELETE on student
FOR EACH ROW
BEGIN
DELETE FROM score WHERE sid=old.sid;
END;
-- 删除学生
DELETE FROM student WHERE sid=1;
-- 修改课程表中某门课的课程号时,对应成绩表中的课程号也做更新
CREATE TRIGGER mytg1
AFTER UPDATE ON course
FOR EACH ROW
BEGIN
UPDATE score SET courseno=new.courseno WHERE cid=new.cid;
END;
-- 
UPDATE course SET courseno=1005 WHERE cid=1;

-- 删除触发器
DROP TRIGGER if EXISTS mytg1;
-- 向成绩表插入一条数据时,判断该学生是否存在,如果不存在,添加学生的信息到学生表
CREATE TRIGGER mytg1 
BEFORE INSERT ON score
for each ROW
BEGIN
DECLARE ID INT(9);
DECLARE sname VARCHAR(20);
DECLARE cusor VARCHAR(20);
if not EXISTS(SELECT*FROM student WHERE sid=new.sid) THEN
SET ID=new.sid;
SET sname=new.stuname;
SET cusor=new.courseno;
end IF;
INSERT INTO student VALUES(ID,sname,cusor);
END;
-- 往学生表中插入信息
INSERT INTO score VALUES(null,'李四',4,87,2,1006);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WMJ_wmj75

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值