Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 递归触发函数_Sql_Postgresql_Stored Procedures_Triggers - Fatal编程技术网

Sql 递归触发函数

Sql 递归触发函数,sql,postgresql,stored-procedures,triggers,Sql,Postgresql,Stored Procedures,Triggers,下面是我的桌子的样子: 我想做的是在表上插入后,生成某个类的所有先决条件。因此,如果我做这个输入: INSERT INTO Prerequisite(classID, term, year, prereqID) VALUES(220, 'Fall', 2016, 200); 它将继续并插入那个,但由于类200是先决条件,它将查看类200本身是否有任何先决条件。如果它找到了一个,它会继续将其插入数据库: INSERT INTO Prerequisite(classID, term

下面是我的桌子的样子:

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

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类是否有一个先决条件等等。我在触发器方面没有太多经验,如有任何帮助,将不胜感激

我认为你的案子是一笔交易;首先找出问题的解决方案,然后考虑是否需要触发器。 您拥有的表结构是一种常见模式,在这种模式中,表本身有一个外键——在本例中,
prereqid
是对同一表中一个或多个其他记录的引用。你在跟踪课程,一门课程的一个特点是,它可能要求你先修一门或多门其他课程

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

与此相反,考虑ECON课程的计量经济学,ECON 200,这需要你既采取了ECON 100和数学102。这是更可能的情况,在这种情况下,您的数据模型不能很好地处理这种情况,因此这是要处理的第一件事

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

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


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

我认为你的案子是一笔交易;首先找出问题的解决方案,然后考虑是否需要触发器。 您拥有的表结构是一种常见模式,在这种模式中,表本身有一个外键——在本例中,
prereqid
是对同一表中一个或多个其他记录的引用。你在跟踪课程,一门课程的一个特点是,它可能要求你先修一门或多门其他课程

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

与此相反,考虑ECON课程的计量经济学,ECON 200,这需要你既采取了ECON 100和数学102。这是更可能的情况,在这种情况下,您的数据模型不能很好地处理这种情况,因此这是要处理的第一件事

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

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

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