递归触发函数

时间:2016-04-24 21:35:04

标签: sql postgresql stored-procedures triggers

所以这就是我的表格:

enter image description here

我想要做的是在表上插入后,生成某个类的所有先决条件。所以如果我这样输入:

INSERT INTO Prerequisite(classID, term, year, prereqID)
       VALUES(220, 'Fall', 2016, 200);

它会继续插入,但是因为类200是先决条件,所以如果类200本身有任何先决条件,它将会查看。如果它找到一个,那么它会继续将其插入到数据库中:

INSERT INTO Prerequisite(classID, term, year, prereqID)
       VALUES(220, 'Fall', 2016, 197);

然后它会去看看197级是否有先决条件等等。我没有很多触发器的经验,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我认为你的案子是交易;首先找出问题的解决方案,然后考虑是否需要触发器。

您拥有的表结构是一种常见模式,其中表具有自身的外键 - 在这种情况下,prereqid是对同一表中的一个或多个其他记录的引用。您正在跟踪课程,而且课程的一个属性是,您可能需要先学习一门或多门其他课程。

考虑这个重要问题:先决条件是否严格分层?例如,在服用CS 200之前,你必须服用CS 100,然后服用CS 101吗?在这种情况下,CS 200的先决条件是100和101 ...但是(重要的是)每个课程只有一个先决条件 - 它们形成一个链。在这种情况下,您不需要触发器,因为当您插入记录时,可能会知道课程的先决条件。

相比之下,考虑计量经济学中的经济学课程,即Econ 200,它要求你已经选择了Econ 100和数学102.这是更可能的情况,在这种情况下,你的数据模型不能很好地处理这种情况,所以这是第一件要处理的事情。

在第二种情况下,你有一个关系:一门课程从零开始到许多先决条件,并且通过这种方式考虑,你可以将它建模为两个表:课程表,其中包含有关术语和年份的信息,以及另一个有课程表的外键。再次,插入课程表需要您知道1)关于课程的信息,以及2)作为其先决条件的课程。

如果您在一个屏幕中捕获此内容,要插入新课程,则需要启动一个事务。第一个命令将插入到课程记录中,并且(可能)自动生成课程的主键。然后,您需要使用每个必备课程的主键,并为每个插入先决条件表中的新行。完成所有这些后,您将提交事务并写入所有记录。在这种情况下,您可以将此作为存储过程(在这种情况下可能是触发器),或者仅作为程序代码中的事务。

我怀疑你会看到这个并说,“是的,但我只需要弄清楚如何在PostgreSQL中编写一个触发器”。简单的部分是CREATE TRIGGER命令;困难的部分是CREATE FUNCTION - 你需要决定如何实现它,以及你在哪里决定这必须是原子事务,以及其他一些东西。当你到达那里时,问一个更具体的问题。