mysql 触发器实现级联删除有外键的多张表
2019-10-12 10:17:44
1、数据,建表时有可能会报错,只需要把前三行注释删掉就行
-- ----------------------------
-- Table structure for tb_grade
-- ----------------------------
DROP TABLE IF EXISTS `tb_grade`;
CREATE TABLE `tb_grade` (
`grade_id` int(11) NOT NULL AUTO_INCREMENT,
`grade_name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`grade_id`),
UNIQUE KEY `grade_check` (`grade_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of tb_grade
-- ----------------------------
INSERT INTO `tb_grade` VALUES ('', '一年级');
INSERT INTO `tb_grade` VALUES ('', '二年级');
INSERT INTO `tb_grade` VALUES ('', '三年级');
INSERT INTO `tb_grade` VALUES ('', '四年级');
INSERT INTO `tb_grade` VALUES ('', '五年级'); -- ----------------------------
-- Table structure for tb_subject
-- ----------------------------
DROP TABLE IF EXISTS `tb_subject`;
CREATE TABLE `tb_subject` (
`subject_id` int(11) NOT NULL AUTO_INCREMENT,
`subject_name` varchar(20) DEFAULT NULL,
`class_hour` int(3) DEFAULT NULL,
`grade_id` int(11) DEFAULT NULL,
PRIMARY KEY (`subject_id`),
KEY `grade_id` (`grade_id`),
CONSTRAINT `tb_subject_ibfk_1` FOREIGN KEY (`grade_id`) REFERENCES `tb_grade` (`grade_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of tb_subject
-- ----------------------------
INSERT INTO `tb_subject` VALUES ('', 'java', '', '');
INSERT INTO `tb_subject` VALUES ('', 'html', '', '');
INSERT INTO `tb_subject` VALUES ('', 'javascript', '', '');
INSERT INTO `tb_subject` VALUES ('', 'database', '', '');
INSERT INTO `tb_subject` VALUES ('', 'java oop', '', '');
INSERT INTO `tb_subject` VALUES ('', 'servlet', '', '');
INSERT INTO `tb_subject` VALUES ('', 'jsp', '', '');
INSERT INTO `tb_subject` VALUES ('', 'struts2', '', '');
INSERT INTO `tb_subject` VALUES ('', 'hibernate', '', '');
INSERT INTO `tb_subject` VALUES ('', 'spring', '', ''); -- ----------------------------
-- Table structure for tb_student
-- ----------------------------
DROP TABLE IF EXISTS `tb_student`;
CREATE TABLE `tb_student` (
`student_no` varchar(20) NOT NULL COMMENT '学号',
`login_pwd` varchar(20) NOT NULL DEFAULT '' COMMENT '密码',
`student_name` varchar(20) NOT NULL COMMENT '姓名',
`sex` enum('女','男') DEFAULT '男' COMMENT '性别',
`grade_id` int(11) DEFAULT NULL COMMENT '年级 - 外键',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`address` varchar(100) DEFAULT '学生宿舍' COMMENT '现住址',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`email` varchar(50) DEFAULT NULL COMMENT '电子邮件',
PRIMARY KEY (`student_no`),
KEY `grade_id` (`grade_id`),
CONSTRAINT `tb_student_ibfk_1` FOREIGN KEY (`grade_id`) REFERENCES `tb_grade` (`grade_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of tb_student
-- ----------------------------
INSERT INTO `tb_student` VALUES ('s01', '', '宋江', '男', '', '', '学生宿舍', '1985-10-10', '13888811111@qq.com');
INSERT INTO `tb_student` VALUES ('s02', '', '卢俊义', '男', '', '', '教场西路8号', '1987-08-08', '13888822222@qq.com');
INSERT INTO `tb_student` VALUES ('s03', '', '吴用', '男', '', '', '教场西路8号', '1991-06-06', '13888833333@qq.com');
INSERT INTO `tb_student` VALUES ('s04', '', '孙二娘', '女', '', '', '教场西路16号', '1983-05-05', '13888844444@qq.com');
INSERT INTO `tb_student` VALUES ('s05', '', '李逵', '男', '', '', '学生宿舍', '1992-01-01', '13888855555@qq.com');
INSERT INTO `tb_student` VALUES ('s06', '', '顾大嫂', '女', '', '', '教场西路16号', '1990-02-02', '13888866666@qq.com');
INSERT INTO `tb_student` VALUES ('s07', '', '柴进', '男', '', '', '学生宿舍', '1991-03-03', null);
INSERT INTO `tb_student` VALUES ('s08', '', '林冲', '男', '', '', '教场西路8号', '1986-04-04', null);
INSERT INTO `tb_student` VALUES ('s09', '', '鲁智深', '男', '', '', '教场西路8号', '1991-05-05', '');
INSERT INTO `tb_student` VALUES ('s10', '', '扈三娘', '女', '', '', '学生宿舍', '1983-06-06', ''); -- ----------------------------
-- Table structure for tb_score
-- ----------------------------
DROP TABLE IF EXISTS `tb_score`;
CREATE TABLE `tb_score` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '成绩编号',
`student_no` varchar(255) NOT NULL COMMENT '学号 - 外键',
`subject_id` int(11) DEFAULT NULL COMMENT '所考科目',
`student_score` float(5,2) DEFAULT '0.00' COMMENT '分数',
`exam_date` date DEFAULT NULL COMMENT '考试日期',
PRIMARY KEY (`id`),
KEY `student_no` (`student_no`),
KEY `subject_id` (`subject_id`),
CONSTRAINT `tb_score_ibfk_1` FOREIGN KEY (`student_no`) REFERENCES `tb_student` (`student_no`),
CONSTRAINT `tb_score_ibfk_2` FOREIGN KEY (`subject_id`) REFERENCES `tb_subject` (`subject_id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of tb_score
-- ----------------------------
INSERT INTO `tb_score` VALUES ('', 's01', '', '90.50', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's02', '', '85.00', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's03', '', '69.50', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's04', '', '85.50', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's05', '', '45.50', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's06', '', '95.50', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's07', '', '76.50', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's08', '', '88.00', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's09', '', '70.00', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's10', '', '55.00', '2016-11-05');
INSERT INTO `tb_score` VALUES ('', 's01', '', '80.50', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's02', '', '70.00', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's03', '', '68.50', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's04', '', '82.50', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's05', '', '43.50', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's06', '', '90.50', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's07', '', '70.50', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's08', '', '80.00', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's09', '', '80.00', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's10', '', '56.00', '2016-11-07');
INSERT INTO `tb_score` VALUES ('', 's01', '', '84.50', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's02', '', '73.00', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's03', '', '69.50', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's04', '', '86.50', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's05', '', '44.50', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's06', '', '80.50', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's07', '', '75.50', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's08', '', '87.00', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's09', '', '85.00', '2016-11-09');
INSERT INTO `tb_score` VALUES ('', 's10', '', '66.00', '2016-11-09');
2、表结构

3、需求:针对数据库中的4张数据表(tb_grade、tb_subject、tb_student、tb_score)
在需要的数据表上创建触发器,达到每删除一个数据表的记录时都能顺顺利执行(级联删除)。
4、具体实现:
-- 为tb_grade创建触发器
DROP TRIGGER IF EXISTS trig_grade;
delimiter //
CREATE TRIGGER trig_grade BEFORE delete on tb_grade for each row
BEGIN
DELETE FROM tb_student WHERE grade_id = old.grade_id;
DELETE FROM tb_subject WHERE grade_id = old.grade_id;
END //
delimiter ; -- 为tb_student创建触发器
DROP TRIGGER IF EXISTS trig_student;
delimiter //
CREATE TRIGGER trig_student BEFORE delete on tb_student for each row
BEGIN
DELETE FROM tb_score WHERE student_no = old.student_no;
END //
delimiter ; -- 为tb_subject创建触发器
DROP TRIGGER IF EXISTS trig_subject;
delimiter //
CREATE TRIGGER trig_subject BEFORE delete on tb_subject for each row
BEGIN
DELETE FROM tb_score WHERE subject_id = old.subject_id;
END //
delimiter ; -- 查看此数据库中的触发器
SHOW TRIGGERS; -- 测试删除数据是否能成功
DELETE FROM tb_student WHERE student_no = "S01";
DELETE FROM tb_grade WHERE grade_id = 1;
DELETE FROM tb_subject WHERE subject_id = 3;
DELETE FROM tb_score WHERE id = 9; -- 最后可以查询表看看有没有被顺利删除
5、tb_score表是没有其他表将外键指向它的主键
想要删除从表的数据,需要先删除主表的数据
mysql 触发器实现级联删除有外键的多张表的更多相关文章
- mysql修改删除列,删除有外键依赖的列
–重命名表rename table t_softwareport to software_port; –建立外键alter table software_port add constraint fk_ ...
- 一个模型中有两个外键指向同一张表时,创建迁移模型时报错:“ HINT: Add or change a related_name argument to the definition for 'AnswersModel.author' or 'AnswersModel.relay_to'.”解决方案
class AnswersModel(models.Model): author = models.ForeignKey(FrontUserModel,null=True,related_name=' ...
- django中有外键关系两张表的相互查找方法
两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 1 平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列, ...
- 【MySQL】MySQL进阶(外键约束、多表查询、视图、备份与恢复)
约束 外键约束 外键约束概念 让表和表之间产生关系,从而保证数据的准确性! 建表时添加外键约束 为什么要有外键约束 -- 创建db2数据库 CREATE DATABASE db2; -- 使用db2数 ...
- mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)
字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...
- MySQL8.0数据库出现的问题——外码创建方式、外键约束两个引用列不兼容问题、check约束问题、用触发器代替check约束、关键字DELIMITER、删除添加索引、删除添加外键约束、和一些数据库方面的操作
一.首先先说一下我们都需要建立那些表 mysql> CREATE TABLE IF NOT EXISTS `student`( -> `sno` CHAR(8) NOT NULL, -&g ...
- MYSQL 外键 on语句 多表查询
外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY KE ...
- 删除带外键的表【foreign key constraint fails】报错
title: 删除带外键的表[foreign key constraint fails]报错 date: 2018-08-02 21:59:06 tags: 数据库 --- 遥想当时正在学hibern ...
- MySQL基础day03 存储引擎和外键MySQL 5.6
MySQL基础day03_存储引擎和外键-MySQL 5.6 外键的条件: 1,表的存储引擎为innodb存储引擎 2,表中外键字段的类型要与参考表的字段类型一致 3,外键字段要是索引类型中的一种 M ...
随机推荐
- 牛客 最大值减去最小值小于或等于 num 的子数组数量
题目链接:https://www.nowcoder.com/practice/5fe02eb175974e18b9a546812a17428e?tpId=101&tqId=33086& ...
- PHPExcel导出工作蒲(多表合并)教程+详细代码解读
最近做了一个需求,导出统计数据,因为需要同时导出多个不同的统计数据,所以不能像以往导出数据列表一样去实现这个需求,刚好空下来就记录一下(PHPExcel导出Excel多sheet合并) 一.主要使用的 ...
- Spring MVC源码分析(二):SpringMVC的DispatcherServlet的设计与实现
概述 DispatcherServlet是SpringMVC的一个前端控制器,是MVC架构中的C,即controller的实现,用于拦截这个web应用的所有请求,具体为在web.xml中配置这个s ...
- pytest-mark跳过
import pytestimport sysenvironment='android' @pytest.mark.skipif(environment=="android",re ...
- actionlib学习
ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息. action也有服务的概念,但是它不一样的地方是:不是一问一答,而多了一个反馈,它会不断反馈项目进度. 如navigat ...
- 15_TLB中的G属性
> TLB 是为了增加访问内存的效率 即 如果 是 29 9 12 分页 请求数据 可能需要访问 4次内存:为了解决这个问题:出现了 TLB (虚拟地址到物理地址的转换关系),如果目标地址在TL ...
- java mysql 数据库
1. jdbc 驱动名还是数据库 String driver = "com.mysql.jdbc.Driver"; //URL指向要访问的数据库名mydataString url ...
- 关于h5打包后 wag包无法安装的问题
如果不是逻辑错误,那么有可能是下列三种情况之一, 1 wgt打包时的appid与安装包不符 2 打包wgt文件和打包安装包文件 用的不是同一个HBuilder账户 3 安装包打包时权限配置,和wgt包 ...
- tomcat 端口被占用 项目端口号被占用怎么解决
1.Win+R 打开运行 ,输入cmd 打开命令行窗口 . 2.假设要查询端口被占用情况,在命令行下输入:netstat -aon|findstr "8883" 3.得到进程 ...
- Delphi ADOQuery的属性 locktype、CursorLocation 、Filter、CursorType、CancelBatch 和 UpdateBatch
以下数据,部分来自网络的收集,部分为自己测试后的原创整理,希望对你有帮助,更新会注明日期. 1.locktype 指定用户打开数据集时对数据集的锁定级别: ltUnspecified 未指定锁定 ...