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 ...
随机推荐
- 2019牛客多校第三场B-Crazy Binary String(前缀和+思维)
Crazy Binary String 题目传送门 解题思路 把1记为1,把0记为-1,然后求前缀和,前缀和相等的就说明中间的01数一样.只要记录前缀和数值出现的位置即可更新出答案. 代码如下 #in ...
- css渐变写法 从左到右渐变三种颜色示例;
background:linear-gradient(to right,#7f06a8,#a02bc2,#7f06a8)
- PyQt5初识
学习PyQt5是个机缘,那是因为我的linux16.04+python3.6使了浑身解数也装不上PyQt4! PyQt5的官方文档貌似是要钱的!又想快速了解这个东东,我还是借鉴了万能的博客园大佬博主: ...
- troff - groff 文档排版系统的 troff 处理器
总览 SYNOPSIS troff [ -abcivzCERU ] [ -d cs ] [ -f fam ] [ -F dir ] [ -m name ] [ -M dir ] [ -n num ] ...
- docker 常用
docker 163仓库 # 更换docker源163 vim /etc/docker/daemon.json { "registry-mirrors": ["http: ...
- LNMP部署
部署企业LNMP架构 源码包:nginx-* ; mysql-* ; php-* ; boost-* ; zend-loader-php5.6-linux-* ;yum软件: pcre-devel z ...
- 深度探索C++对象模型之第三章:数据语义学
如下三个类: class X { }: class Y :public virtual X { }; class Z : public virtual X {}; class A :public Y, ...
- 1.Struts2快速入门
Struts2是一个基于MVC设计模式的Web层框架 Web层框架的特点:前端控制器模式 快速入门 1.下载Struts2的框架包 https://struts.apache.org/ 2.导入jar ...
- vue生态系统之vue-router
一.vue-router安装与使用 1.安装 进入项目目录中安装vue-router模块 E:\vueProject\webpackProject>cnpm install vue-router ...
- webpack4.0基础
安装 yarn add webpack webpack-cli -D npx webpack index.js 图片 file-loader module: { rules: [ { test: /\ ...