基于一列的值,使用PostgreSQL触发器更改或更新每行中的另一列的值。

12

我是一个PostgreSQL的新手学生。我的学生表中只有4列。

id              serial,
student_name    varchar(50), 
student_marks   integer,
grade           varchar(1)

现在我希望创建一个触发器(语言:PL/SQL),名为fill_grade_auto,根据student_marks,自动更新成绩为A(超过90分),B(超过60但小于90)和其余的为C级。

这个触发器应该在每次插入或更新每一行后都会被触发。我尝试了不同的方法,但都没有成功。


请在您的尝试中包含一些代码 - iandotkelly
10
好问题和好答案 - 为什么它被关闭了?它真的很有帮助! - Prosto Trader
1
我已经标记了mod干预,以尝试重新打开这个问题。 - raphael
1个回答

18
你可以这样做。
CREATE OR REPLACE FUNCTION set_grade() 
RETURNS TRIGGER 
AS $$
BEGIN
  NEW.grade := CASE WHEN NEW.student_marks >= 90 THEN 'A' 
                    WHEN NEW.student_marks BETWEEN 60 AND 89 THEN 'B' 
                    ELSE 'C' END;

  RETURN NEW;
END $$ LANGUAGE plpgsql;

CREATE TRIGGER set_grade_trigger 
BEFORE INSERT OR UPDATE ON students 
FOR EACH ROW 
  EXECUTE PROCEDURE set_grade();

注意: 因为您的问题在主题上有些含糊不清,您可能需要调整CASE中的分数范围。如果逐字逐句地阅读,90的值不属于任何一个等级。因此我冒昧地按照自己的理解来解释它 (A: 90<=marks, B: 60<= marks<90, c: marks<60)。

这里是SQLFiddle演示。


它有帮助吗?你需要更多关于你的问题的帮助吗? - peterm
非常感谢peterm!!!这只是提醒我需要真正努力学习PL/SQL。 - Mayur_on_Postgresql
谢谢!Stupeditors关闭好问题。 - Prosto Trader
我之前使用了AFTER而不是BEFORE,感到困惑,但这有助于解决问题。 - Rafs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接