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`;
-- (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`);
-- (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`;
-- 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_学号';
-- 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`;