我如何在mysql中编写一个用户定义的函数,这样当我从一个表中删除一行时,另一个表中的特定行也会被删除?

ctrmrzij  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(253)
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表中删除该行。提前谢谢!

rjee0c15

rjee0c151#

您可以使用触发器或级联约束,也可以只将逻辑写入delete查询本身,但是您的模式有太多错误,因此我认为您需要回顾一下关系数据库的工作方式。
需要考虑的几点:
在mysql中,int后面的括号中的数字几乎没有意义。我鼓励您完全忽略这个值,并让mysql假设该数据类型的默认值。
我不确定什么是student\u类,但将其存储在student表中可能不明智
在结果表中存储除学生id以外的任何学生信息显然是多余的
见标准化。数据库表不是电子表格。你不会为每个主题都有单独的专栏。相反(并稍微取决于您的报名过程),您的成绩表可能如下所示:
学号、年份、学期、科目号、分数

zqry0prt

zqry0prt2#

直接回答:
你可以使用一个过程,甚至一个触发器,但不能使用函数。
建议:
如果这只是一个示例,并且您并没有将完全相同的数据保存在两个不同的表中,请使用外键。然后您甚至可以添加递归删除。如果这是你的实际结构,你应该重新考虑。

o2gm4chl

o2gm4chl3#

您只需使用外键就可以使用cascade执行任务。
更改表格 result_sheet_1 添加外键( student_id )参考文献 test . student ( student_id )删除级联更新级联;

相关问题