【问题标题】:Recursive Trigger Function递归触发函数
【发布时间】:2016-04-24 21:35:03
【问题描述】:

这就是我的桌子的样子:

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

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 班是否有先决条件等等。我对触发器没有很多经验,任何帮助将不胜感激。

【问题讨论】:

    标签: sql postgresql stored-procedures triggers


    【解决方案1】:

    我认为你的案子是一笔交易;先从大体上找出解决问题的办法,再考虑是否需要触发器。

    您拥有的表结构是一种常见的模式,其中表具有自身的外键——在这种情况下,prereqid 是对同一表中一个或多个其他记录的引用。您似乎正在跟踪课程,并且课程的一个属性是它可能要求您首先参加一门或多门其他课程。

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

    相比之下,考虑一门计量经济学的经济学课程,即 Econ 200,它要求您同时修读 Econ 100 和数学 102。这种情况更有可能发生,在这种情况下,您的数据模型不能很好地处理这种情况,所以这是要处理的第一件事。

    在第二种情况下,您有一个关系:一门课程有从零到多个先决条件,通过这种方式考虑,您可以将其建模为两个表:包含学期和年份信息的课程表,以及另一个有课程表的外键。同样,插入课程表需要您知道 1) 有关课程的信息,以及 2) 作为其先决条件的课程。

    如果您在一个屏幕上捕捉到这一点,要插入新课程,您需要开始交易。第一个命令将插入课程记录,并(可能)自动生成课程的主键。然后,您需要使用每个先修课程的主键,并为每门课程在先修课程表中插入一个新行。完成所有这些后,您将提交事务并写入所有记录。在这种情况下,您可以将其作为存储过程(在这种情况下可能是触发器),或仅作为程序代码中的事务来执行。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2015-11-22
      • 2023-03-19
      • 2015-03-01
      • 2021-06-05
      相关资源
      最近更新 更多