MySQL实验八 创建触发器

MySQL实验八 创建触发器

一、实验环境:

Win 10 mysql8.2

二、实验内容与完成情况:

-- 3.1 创建触发器
 -- (1) 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)为员工医疗
-- 保险系统(实验 03 创建的 7 个表)创建触发器“insurance_row_tri”,当删除医保表
-- “insurance”中某医保卡号的记录时触发,输出“XX 卡号的记录删除成功!”。删除
-- 某记录,并查看结果。

-- //创建触发器
delimiter //
create trigger `insurance_row_tri` after 
delete on `insurance`
for each row 
begin
set @oldcno =old.cno;
select concat(@oldcno,"卡号的记录删除成功") into @asd;
end;
-- //插入数据
insert into insurance values(20201212,'3',100,'1');
-- //删除数据
delete from insurance where cno ='3';
-- //查询结果
select @asd;
-- //删除触发器
drop trigger `insurance_row_tri`;

image-20210612180700757

-- (2) 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)为员工医疗
-- 保险系统(实验 03 创建的 7 个表)创建触发器“update_row_tri”,当医保卡表“card”
-- 的某一“cno”值更改时,消费表“consume”中对应的“cno”值也跟着进行相应的更改。
-- 更改“card”表的某一“cno”值,查看“consume”表中对应的“cno”值是否发生变化。
-- (提示:原来这两张表是有主外键关联的,测试如果不删除主外键能否实现;
-- 如果不行,可以先删除主外键关联。)

-- //创建触发器
delimiter //
create trigger `update_row_tri` after 
update on `card`
for each row 
begin
if old.cno!=new.cno then
update `consume` set consume.cno=new.cno where consume.cno=old.cno;
end if;
end;
-- //因为consume表空数据 提前插入数据测试
insert into `consume` values('1','1',20210612,'阿莫西林',10,199);
-- //修改数据
update `card` set card.cno=13 where card.cno=10;
-- MySQL error1451 外键异常处理
-- 表有外键所以delete报错了,这里有2种办法处理:
-- 1.临时设置外键失效
-- 2.删除表涉及到的外键的表的数据
-- //这里用第一种方法:
SET FOREIGN_KEY_CHECKS = 0;
-- 再次执行update即可成功
-- //删除触发器
drop trigger `update_row_tri`;

-- 特殊情况下:MySQL报错1175
-- 原因:MySql 运行在 safe-updates模式下
-- 该模式会导致非主键条件下无法执行update或者delete命令
-- 解决方法:提前删除主外键
-- 删除主键
alter table `card` drop primary key;
alter table `consume` drop primary key;
-- 主键重新添加
alter table `card` add primary key(cno);
alter table `consume` add primary key(`sno`,`hno`,`sdate`);

imgimg

img

imgimg

-- (3) 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)为员工医疗保险
-- 系统(实验 03 创建的 7 个表)创建触发器“delete_tri”,当删除员工表“staff”中某
-- 个员工的信息时,将就诊表“see”中该员工的所有信息一并删除。删除“staff”表中
-- 某个员工的信息,查看“see”表是否还有该员工的信息。(提示:原来这两张表是有
-- 主外键关联的,测试如果不删除主外键能否实现;如果不行,可以先删除主外键
-- 关联。)

-- //创建触发器
delimiter //
create trigger `delete_tri` after 
delete on `staff`
for each row 
begin
delete from `see` where see.sno=old.sno;
end;
-- //因为see表空数据 提前插入数据测试
insert into `see` values('2','1',20210612);
-- //删除数据
delete from `staff` where sno=2;
-- //删除触发器
drop trigger `delete_tri`;

imgimg

img

imgimg

-- 3.2 查看触发器
--  (1) 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)查看员工医
-- 疗保险系统(实验 03 创建的 7 个表)数据库中的所有触发器。
show triggers;
-- (2) 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)查看员工医
-- 疗保险系统(实验 03 创建的 7 个表)数据库中的触发器。使用数据字典中查看员
-- 工医疗保险数据库中触发器
select * from information_schema.triggers where  TRIGGER_SCHEMA='db_test_学号';
img img
-- 3.3 删除触发器
-- (1) 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)删除触发器
-- “update_row_tri”。
-- //删除触发器
drop trigger `update_row_tri`;
-- (2) 使用 MySQL 命令行或者 workbench(或者 Navicat for MySQL)删除触发器
-- “delete_tri”。
-- //删除触发器
drop trigger `delete_tri`;
  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值