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 ...
随机推荐
- 1.6 flux介绍
这一节将介绍 React 的核心应用架构模式 Flux,包括内容: Flux 介绍 MVC 架构之痛 Flux 的理解 Flux 相关库和工具介绍 Flux 与 React 实例 最后我们将会把之前的 ...
- Hexo使用攻略-添加分类及标签
创建"分类"选项 生成"分类"页并添加tpye属性 打开命令行,进入博客所在文件夹.执行命令 hexo new page categories 成功后会提示: ...
- ASP.Net 第一天笔记 MVC 控制器与视图数据传递注意事项
1.如果方法的参数的名称与表单元素Name属性的值一致的话,会自动填充 2.如果表单元素的Name属性与实体类型中属性一致,那么表单中的数据会自动赋值给实体中的属性 3.控制器中重载的方法 方法前上边 ...
- Django的日常-数据传输
目录 Django的日常-1 Django中最常用的三个东西 HTTPresponse render redirect 静态文件相关 form表单的get与post 神奇的request 模板的传值方 ...
- python面试题之你如何管理不同版本的代码?
答案: 版本管理!被问到这个问题的时候,你应该要表现得很兴奋,甚至告诉他们你是如何使用Git(或是其他你最喜欢的工具)追踪自己和奶奶的书信往来.我偏向于使用Git作为版本控制系统(VCS),但还有其他 ...
- 页面上有3个输入框:分别为max,min,num;三个按钮:分别为生成,排序,去重;在输入框输入三个数字后,先点击生成按钮,生成一个数组长度为num,值为max到min之间的随机整数点击排序,对当前数组进行排序,点击去重,对当前数组进行去重。 每次点击之后使结果显示在控制台
<!DOCTYPE html> <html> <head> <!-- 页面上有3个输入框:分别为max,min,num:三个按钮:分别为生成,排序,去重: 在 ...
- C#操作Word的+ CKEditor 輸出成Word文件(包含圖案上傳)
C#操作Word 参考博文: C#操作word类文件 https://www.cnblogs.com/walking/p/3571068.html C#中的Office操作专栏(21) http:// ...
- vimtutor - Vim 教程
总览 (SYNOPSIS) vimtutor 描述 (DESCRIPTION) Vimtutor 打开 Vim 教程. 它首先 考备 文件, 这样 就可以 在 不改变 原文件 的情况下 修改 当前文件 ...
- windows版nginx+ftp实现图片服务器的搭建
配置图片服务器的一部分参数 resource.properties: #FTP\u76f8\u5173\u914d\u7f6e #FTP\u7684ip\u5730\u5740 FTP_ADDRESS ...
- redis设置自动启动
按照如下操作即可(可以自定义目录) mkdir /redis cd /redis wget http://download.redis.io/releases/redis-4.0.1.tar.gz t ...