码迷,mamicode.com
首页 > 数据库 > 详细

mysql 触发器实现级联删除有外键的多张表

时间:2019-10-12 11:32:43      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:表结构   --   delete   hibernate   records   http   using   servlet   base   

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 (1, 一年级);
INSERT INTO `tb_grade` VALUES (2, 二年级);
INSERT INTO `tb_grade` VALUES (3, 三年级);
INSERT INTO `tb_grade` VALUES (4, 四年级);
INSERT INTO `tb_grade` VALUES (5, 五年级);

-- ----------------------------
-- 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 (1, java, 60, 1);
INSERT INTO `tb_subject` VALUES (2, html, 40, 1);
INSERT INTO `tb_subject` VALUES (3, javascript, 30, 1);
INSERT INTO `tb_subject` VALUES (4, database, 60, 2);
INSERT INTO `tb_subject` VALUES (5, java oop, 60, 2);
INSERT INTO `tb_subject` VALUES (6, servlet, 40, 2);
INSERT INTO `tb_subject` VALUES (7, jsp, 40, 2);
INSERT INTO `tb_subject` VALUES (8, struts2, 60, 3);
INSERT INTO `tb_subject` VALUES (9, hibernate, 60, 3);
INSERT INTO `tb_subject` VALUES (10, spring, 60, 3);

-- ----------------------------
-- 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 123456 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, 123456, 宋江, , 1, 13888811111, 学生宿舍, 1985-10-10, 13888811111@qq.com);
INSERT INTO `tb_student` VALUES (s02, 123456, 卢俊义, , 1, 13888822222, 教场西路8号, 1987-08-08, 13888822222@qq.com);
INSERT INTO `tb_student` VALUES (s03, 123456, 吴用, , 2, 13888833333, 教场西路8号, 1991-06-06, 13888833333@qq.com);
INSERT INTO `tb_student` VALUES (s04, 123456, 孙二娘, , 2, 13888844444, 教场西路16号, 1983-05-05, 13888844444@qq.com);
INSERT INTO `tb_student` VALUES (s05, 123456, 李逵, , 1, 13888855555, 学生宿舍, 1992-01-01, 13888855555@qq.com);
INSERT INTO `tb_student` VALUES (s06, 123456, 顾大嫂, , 1, 13888866666, 教场西路16号, 1990-02-02, 13888866666@qq.com);
INSERT INTO `tb_student` VALUES (s07, 123456, 柴进, , 3, 13888877777, 学生宿舍, 1991-03-03, null);
INSERT INTO `tb_student` VALUES (s08, 123456, 林冲, , 3, 13888888888, 教场西路8号, 1986-04-04, null);
INSERT INTO `tb_student` VALUES (s09, 123456, 鲁智深, , 3, 13888899999, 教场西路8号, 1991-05-05, ‘‘);
INSERT INTO `tb_student` VALUES (s10, 123456, 扈三娘, , 2, 13888800000, 学生宿舍, 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 (1, s01, 1, 90.50, 2016-11-05);
INSERT INTO `tb_score` VALUES (2, s02, 1, 85.00, 2016-11-05);
INSERT INTO `tb_score` VALUES (3, s03, 1, 69.50, 2016-11-05);
INSERT INTO `tb_score` VALUES (4, s04, 1, 85.50, 2016-11-05);
INSERT INTO `tb_score` VALUES (5, s05, 1, 45.50, 2016-11-05);
INSERT INTO `tb_score` VALUES (6, s06, 1, 95.50, 2016-11-05);
INSERT INTO `tb_score` VALUES (7, s07, 1, 76.50, 2016-11-05);
INSERT INTO `tb_score` VALUES (8, s08, 1, 88.00, 2016-11-05);
INSERT INTO `tb_score` VALUES (9, s09, 1, 70.00, 2016-11-05);
INSERT INTO `tb_score` VALUES (10, s10, 1, 55.00, 2016-11-05);
INSERT INTO `tb_score` VALUES (11, s01, 2, 80.50, 2016-11-07);
INSERT INTO `tb_score` VALUES (12, s02, 2, 70.00, 2016-11-07);
INSERT INTO `tb_score` VALUES (13, s03, 2, 68.50, 2016-11-07);
INSERT INTO `tb_score` VALUES (14, s04, 2, 82.50, 2016-11-07);
INSERT INTO `tb_score` VALUES (15, s05, 2, 43.50, 2016-11-07);
INSERT INTO `tb_score` VALUES (16, s06, 2, 90.50, 2016-11-07);
INSERT INTO `tb_score` VALUES (17, s07, 2, 70.50, 2016-11-07);
INSERT INTO `tb_score` VALUES (18, s08, 2, 80.00, 2016-11-07);
INSERT INTO `tb_score` VALUES (19, s09, 2, 80.00, 2016-11-07);
INSERT INTO `tb_score` VALUES (20, s10, 2, 56.00, 2016-11-07);
INSERT INTO `tb_score` VALUES (21, s01, 3, 84.50, 2016-11-09);
INSERT INTO `tb_score` VALUES (22, s02, 3, 73.00, 2016-11-09);
INSERT INTO `tb_score` VALUES (23, s03, 3, 69.50, 2016-11-09);
INSERT INTO `tb_score` VALUES (24, s04, 3, 86.50, 2016-11-09);
INSERT INTO `tb_score` VALUES (25, s05, 3, 44.50, 2016-11-09);
INSERT INTO `tb_score` VALUES (26, s06, 3, 80.50, 2016-11-09);
INSERT INTO `tb_score` VALUES (27, s07, 3, 75.50, 2016-11-09);
INSERT INTO `tb_score` VALUES (28, s08, 3, 87.00, 2016-11-09);
INSERT INTO `tb_score` VALUES (29, s09, 3, 85.00, 2016-11-09);
INSERT INTO `tb_score` VALUES (30, s10, 3, 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 触发器实现级联删除有外键的多张表

标签:表结构   --   delete   hibernate   records   http   using   servlet   base   

原文地址:https://www.cnblogs.com/zhangzimuzjq/p/11659842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!