2017-08-09 128 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');