如何在MySQL中编写用户定义的函数,以便在从一个表中删除一行时,另一个表中的特定行也会被删除?

时间:2018-06-06 06:36:47

标签: mysql

CREATE TABLE `student`

(
  `student_id` int(5) NOT NULL AUTO_INCREMENT,
  `student_first_name` varchar(30) not null,
  `student_lase_name` varchar(30) not null,
  `student_roll_no` int(5) not null,
  `student_class` int(2) not null,
  PRIMARY KEY (`student_id`)
);

CREATE TABLE `result_sheet_1`
(
  `student_id` int(5),
  `student_first_name` varchar(30),
  `student_lase_name` varchar(30),
  `student_roll_no` int(5),
  `student_class` int(2),
  `mid_1_english` int(2),
  `mid_2_english` int(2),
  `mid_1_mathematics` int(2),
  `mid_2_mathematics` int(2),
  `semester_final_english` int(2),
  `semester_final_mathematics` int(2)
);

delimiter $$
create trigger result_sheet_1_insert_trigger

after insert on student
for each row 
begin 
insert into result_sheet_1(student_id, student_first_name, student_lase_name, student_roll_no, student_class, mid_1_english, mid_2_english, mid_1_mathematics, mid_2_mathematics, semester_final_english, semester_final_mathematics)
values (new.student_id, new.student_first_name, new.student_lase_name, new.student_roll_no, new.student_class, 0, 0, 0, 0, 0, 0);

end$$
delimiter ;

每当从student表中删除该特定行时,我想通过用户定义的函数从result_sheet_1中删除一行。提前谢谢!

3 个答案:

答案 0 :(得分:1)

直接回答:

您可以使用程序甚至是触发器,但不能使用函数。

<强>建议:

如果这只是一个示例,并且您并未真正在两个不同的表中保存完全相同的数据,请使用外键。然后你甚至可以添加递归删除。如果这是你的实际结构,你应该重新考虑它。

答案 1 :(得分:1)

您可以使用触发器或级联约束,或者您可以将逻辑写入DELETE查询本身,但是您的架构存在很多错误,我认为您需要退后一步并查看关系数据库的方式工作

需要考虑的一些要点:

  • 在MySQL中,INT之后括号中的数字几乎没有意义。我建议你完全省略这个值,让MySQL假定该数据类型的默认值。

  • 我不确定student_class是什么,但将它存储在学生表中可能不明智

  • 在结果表中存储除student_id之外的任何学生信息显然是多余的

  • 请参阅规范化。数据库表不是电子表格。每个主题都没有单独的列。相反(并略微取决于您的注册过程)您的结果表可能如下所示:

    student_id数据, 年, 长期/学期, subject_id, 评分

答案 2 :(得分:1)

您只需使用外键即可使用Cascade执行任务。

  

ALTER TABLE result_sheet_1添加外键(student_id)   参考teststudentstudent_id)ON DELETE CASCADE ON UPDATE   CASCADE;