2017-08-09 130 views
1

在下表中,電影表是的子類顯示表。 對於插入(通過網絡接口)到表每一個新的行顯示我想插入一行到電影: 例如,爲插入的每個外鍵插入主鍵

INSERT INTO shows title VALUES ('title'); 

這將在添加一個新行顯示showid = next value in sequence,and title ='title'... 我想要的是獲得showid value(from shows)並將其插入到電影表中的新行中。

我該怎麼做?

CREATE SEQUENCE shows_showid_seq; 
CREATE TABLE "shows" (
    "showid" BIGINT NOT NULL PRIMARY KEY DEFAULT nextval('shows_showid_seq'), 
    "title" TEXT NOT NULL, 
    "rating" BIGINT, 
    "language" TEXT, 
    "genre" TEXT 
    ); 

CREATE TABLE "films" (
    "showid" BIGINT NOT NULL CONSTRAINT films_showid 
    REFERENCES shows("showid") ON DELETE SET NULL, 
    "year" INT, "reldate" DATE 
    ); 
+0

所以要自動記錄插入到電影,當行插入電影嗎? –

+0

是的,每當插入到表中的新行顯示並且具有showid = $ value時,我想要在影片中插入一個新行showid = $ value – hythm

回答

0

所以,如果我正確理解你的問題,你正在尋找簡單的自動插入電影后,在節目插入已發生。

所以你首先需要做的是寫一個FUNCTION來處理插入操作(參考:https://www.postgresql.org/docs/9.1/static/sql-createfunction.html

然後當特定事件發生時寫TRIGGER執行該功能(參考:https://www.postgresql.org/docs/9.1/static/sql-createtrigger.html

參考到具有功能的一個例子的另一柱,How to insert data into table using stored procedures in postgresql

而另一SO引用是有點更全面,更包括具有FUNCTION,Postgresql: Creating a Trigger沿觸發器。

這應該足以幫助你將一些東西縫在一起。要走出家門,否則我會四處遊玩並寫出來,我當然可以使用這種做法。但我希望這足以幫助你朝正確的方向前進。

+1

謝謝您的鏈接,我現在正在閱讀它們。我也更新了我的問題,希望更清楚。 – hythm

+1

所以審查文檔後,我創建了一個功能(不認爲我需要TRIGGER在這種情況下): 'CREATE OR REPLACE FUNCTION add_movie(mtitle TEXT)返回void AS」 DECLARE curshowid BIGINT; BEGIN INSERT INTO SHOWS(title)VALUES(mtitle)RETURNING showid INTO curshowid; INSERT INTO films(showid)VALUES(curshowid); END; ' LANGUAGE plpgsql;' 並調用該函數:SELECT add_movie('New Movie!'); 所以這是我的解決方案,我想看看是否有更好的解決方案做相同的事情之前我標記我的線程解決。 – hythm

+0

不錯的工作!我很高興你能夠把它照顧好。當你開始搞亂TRIGGERS和FUNCTIONS時,SQL變得非常有趣。我幾個月前纔開始使用它們。唯一可能的缺點是,如果其他人正在與數據庫進行交互,但他們並不知道這些設置,他們可能無法完全理解幕後發生的魔法。 –

0

這裏是我落得這樣做:

CREATE FUNCTION add_movie(movie_title TEXT, movie_overview TEXT) RETURNS void 
    LANGUAGE plpgsql 
    AS $$ 
DECLARE 
current_showid BIGINT; 
BEGIN 
INSERT INTO shows (title, overview) VALUES (movie_title, movie_overview) RETURNING showid INTO current_showid; 
INSERT INTO films (showid) VALUES (current_showid); 
END; 
$$; 

並插入一個新的電影,我跑:SELECT add_movie('Title', 'Overview');