当前位置:Gxlcms > 数据库问题 > mysql 触发器实现级联删除有外键的多张表

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

时间:2021-07-01 10:21:17 帮助过:6人阅读

---------------------------- -- 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 = 
                        
                    

人气教程排行