Oracle SQL Developer中的触发器
我需要设置一个Oracle SQL Developer中的触发器,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,我需要设置一个触发器,将“成绩”表中的某个人的成绩从null更改为“D”,如果他们从“学生”表中删除。到目前为止,我已经: create or replace trigger delete_from_student after delete on student for each row begin update grades set grade = 'D' where grade = '' end delete_from_student; 我知道这不可能是对的,因为我在“end”上有
触发器
,将“成绩”表中的某个人的成绩从null
更改为“D”,如果他们从“学生”表中删除。到目前为止,我已经:
create or replace trigger delete_from_student
after delete on student
for each row
begin
update grades
set grade = 'D'
where grade = ''
end delete_from_student;
我知道这不可能是对的,因为我在“end”上有红色下划线。我还认为应该有人确保只有从“student”表中删除的学生才能将他们的成绩更改为D。到目前为止,我们只做了这样一件事:如果你将某人添加到表a中,那么他们会自动放入表B中,因此,我在如何使用带有触发器的更新而不是插入以及确保只影响“GRADES”表中的一行时被绊倒了。谢谢你的帮助
编辑:我已经阅读了更多的页面,我终于想出了触发的语法:
create or replace trigger delete_from_student
after delete on student
for each row
begin
update grades set
grade = 'D'
where grade is null;
end delete_from_student;
现在我的问题是,就像我担心的那样,它会影响“成绩”表上的每一行,而不仅仅是被删除的学生。现在我的问题是,如何确保我只影响我删除的学生的行
第二次编辑:这个练习的目的只是教我们触发器是如何工作的,而不是创建一个功能数据库。教授在开场白中说,由于其他人列出的原因,你不会在现实世界中这样做,但他只是在教我们有关触发器的知识 如果表中存在student_id列,请使用该列,并使用before delete触发器。 此处:old.student_id是删除行中列的值
create or replace trigger delete_from_student
before delete on student
for each row
begin
update grades set
grade = 'D'
where grade is null
and student_id=:old.student_id;
end delete_from_student;
一个问题:你为什么要这样做?从那以后就再也没有了。由于设置清楚,年级是学生的子表,每个年级之间应该有一个FK。如果FK不存在,他们愿意接受孤立分数行;这就是你如此努力的工作所创造的。 如果FK确实存在,则ON Delete子句有3种可能性
因此,在流程结束时,您有一个异常或孤立的成绩行,您无法确定该行所属的学生,因为该学生行已不存在。如果是这样的话,显然您的数据模型已经损坏 提示:
成绩为空
。请编辑问题并显示表格定义。这种情况没有意义。如果删除某个学生记录,则假设您具有有效的外键定义,则该学生将不会有任何成绩。您不希望该成绩不链接到任何学生。请参阅下面的@Belayer答案。欢迎使用SO。请阅读此文,了解一旦有人回答您的问题,您必须做什么。关键是教我们触发器,最终结果不应该是功能性的,这就是问题所在。使用不好的示例/流程进行教学就是不好的教学,尤其是当有好的功能示例可供使用时。