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 ...
随机推荐
- PHP面试 PHP基础知识 二(常量及数据类型)
常量及数据类型 PHP八种数据类型 四种标量类型 字符串(string).布尔(boolean).浮点(float/double).整型(integer) 两种复合类型 数组(array).对象(ob ...
- Delphi多线程详解
(整理自网络) Delphi多线程处理 1-1多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者 ...
- Haskell语法
http://www.ibm.com/developerworks/cn/java/j-cb07186.html 1. 构造符号 : 比如: 1:2:3:[] 而常用的 [1,2,3] 是一种语法糖( ...
- HVM(Hardware-Assisted Virtualization)
A set of extra instructions is added that can be used by a process in VMX rootmode. These instructio ...
- 【Java多线程系列五】列表类
一些列表类及其特性 类 线程安全 Iterator 特性 说明 Vector 是 fail-fast 内部方法用synchronized修饰,因此执行效率较低 1. 线程安全的列表类并不意味着调用它 ...
- Linux编程获取本机IP地址
使用函数getifaddrs来枚举网卡IP,当中使用到的结构体例如以下所看到的: struct ifaddrs { struct ifaddrs *ifa_next; /* Next item in ...
- springboot + zipkin + mysql
zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...
- 二分法的应用:POJ1064 Cable master
/* POJ1064 Cable master 时间限制: 1000MS 内存限制: 10000K 提交总数: 58217 接受: 12146 描述 Wonderland的居民已经决定举办地区性编程比 ...
- JS分支结构与循环结构
1.分支结构 ①if语句 语法结构 if (/* 条件表达式 */) { // 执行语句 } if (/* 条件表达式 */){ // 成立执行语句 } else { // 否则执行语句 } ...
- MLE极大似然估计和EM最大期望算法
机器学习十大算法之一:EM算法.能评得上十大之一,让人听起来觉得挺NB的.什么是NB啊,我们一般说某个人很NB,是因为他能解决一些别人解决不了的问题.神为什么是神,因为神能做很多人做不了的事.那么EM ...