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 ...
随机推荐
- Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别 Pig
Hadoop生态上几个技术的关系与区别:hive.pig.hbase 关系与区别 Pig 一种操作hadoop的轻量级脚本语言,最初又雅虎公司推出,不过现在正在走下坡路了.当初雅虎自己慢慢退出pig的 ...
- XML XPATH simpleXML
XPath 通过DOM结构定位节点,在数据量很大的情况下速度下降的很厉害.解决方法是XPath.Xpath的作用:用于快速定位节点 position()是节点的位置,节点的位置是从1开始 simple ...
- html01. <!DOCTYPE html>
解释 在HTML文档初,往往会有这么一句话<!DOCTYPE html>,它是html5标准网页声明,全称为Document Type HyperText Mark-up Language ...
- Netty 源码学习——服务端流程分析
在上一篇我们已经介绍了客户端的流程分析,我们已经对启动已经大体上有了一定的认识,现在我们继续看对服务端的流程来看一看到底有什么区别. 服务端代码 public class NioServer { pr ...
- kafka单机版的安装、集群部署 及使用
1.安装kafka(单机版) 1.1上传 kafka_2.11-2.0.0.tgz 到 /root/Downloads 1.2解压 tar 包 tar -zxvf kafka_2.11-2.0.0.t ...
- Pandas异常值处理
import pandas as pd #生成异常数据 df=pd.DataFrame({'col1':[1,120,3,5,2,12,13], 'col2':[12,17,31,53,22,32,4 ...
- OMG that's another blog!
目录 1.Beginning 2.then 1.Beginning we'v learnt how to ask file from our own computer and tried to bui ...
- eclipse 在复制/粘贴 时很卡(转)
最近发现eclipse在按Ctrl+C 时卡的要命,在网上找了一下,发现原来如此: 打开选项: Window -> Preferences -> General -> Editors ...
- Linux fork创建子进程
1. pid_t fork(void); 功能:创建父子进程 参数:无 返回值:成功:在父进程中:返回值为子进程的PID 在子进程中:返回值为0 失败:-1 注意: 1)fork函数是用来创建进程的 ...
- Python全栈开发:RabbitMQ/Redis/Memcache/SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...