2016-04-24 134 views
0

因此,這裏是我的表是什麼樣子:遞歸觸發功能

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有一個先決條件等等。我沒有很多觸發器的經驗,任何幫助將不勝感激。

回答

2

我認爲你的情況是一個交易;首先找出問題的解決方案,然後考慮是否需要觸發器。

您擁有的表格結構是一種常見模式,其中表格中有一個外鍵 - 在這種情況下,prereqid是對同一表格中的一個或多個其他記錄的引用。你似乎正在追蹤課程,而且課程的一個特點是它可能需要你首先參加一門或多門其他課程。

考慮一下這個重要的問題:先決條件是嚴格等級制的嗎?例如,在服用CS 200之前,您是否需要服用CS 100和CS 101?在這種情況下,CS 200的先決條件是100和101 ......但(重要的是)每門課程只有一個先決條件 - 它們形成一個鏈條。在這種情況下,您不需要觸發器,因爲大概在插入記錄時知道課程的先決條件。

相比之下,考慮計量經濟學中的經濟學課程Econ 200,它需要您已經考慮過Econ 100和Math 102.這是更可能的情況,在這種情況下,您的數據模型不能很好地處理這種情況,所以這是第一件要處理的事情。

在第二種情況下,你有一種關係:一門課程從零到許多先決條件,並且以這種方式思考,你可以將它建模爲兩個表格:具有關於術語和年份信息的課程表,另一個在課程表中有一個外鍵。再次,插入課程表需要你知道1)關於課程的信息,2)作爲其先決條件的課程。

如果您在一個屏幕中捕獲了此信息,要插入新課程,您需要開始一個事務。第一個命令會插入課程記錄中,並且(可能)會自動生成課程的主鍵。然後,您需要使用每個必備課程的主鍵,並且每次向prerequisites表中插入新行。當所有這些都完成後,您將提交交易並寫入所有記錄。在這種情況下,您可以將其作爲存儲過程(在這種情況下可能是觸發器)來執行此操作,也可以將其作爲程序代碼中的事務來執行。

我懷疑你會看看這個,並說,「是的,但我只需要弄清楚如何在PostgreSQL中編寫觸發器」。簡單的部分是CREATE TRIGGER命令;最難的部分是CREATE FUNCTION--這就是你需要決定如何實現它的地方,以及你認爲這必須是原子事務的地方,以及其他一些東西。當你到達那裏時詢問更具體的問題。