Postgresql 为插入的每个外键插入主键

Postgresql 为插入的每个外键插入主键,postgresql,Postgresql,在下表中,电影表是节目表的子类。 对于插入到表中的每一行(通过web界面)显示的我想在电影中插入一行: 比如说, INSERT INTO shows title VALUES ('title'); 这将在shows中添加一个新行,其中showid=序列中的下一个值,title='title'。。。 我想要的是获取showid的值(来自shows),并将其插入到films表的新行中 我该怎么做 CREATE SEQUENCE shows_showid_seq; CREATE TABLE "sho

在下表中,电影表是节目表的子类。 对于插入到表中的每一行(通过web界面)显示的我想在电影中插入一行: 比如说,

INSERT INTO shows title VALUES ('title');
这将在shows中添加一个新行,其中showid=序列中的下一个值,title='title'。。。 我想要的是获取showid的值(来自shows),并将其插入到films表的新行中

我该怎么做

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
    );

所以,如果我没弄错你的问题的话,你只是想在电影放映后自动插入

因此,您首先需要编写一个
函数来处理插入操作(参考:)

然后编写一个
触发器
,在给定事件发生时执行该函数(参考:)

引用另一篇具有函数示例的帖子

还有一个更全面的参考,包括一个触发器和一个函数


这应该足以帮助你把东西缝合在一起。就要走出家门了,否则我会到处玩,把这些写出来,我当然可以用这个练习。但我希望这足以帮助您朝着正确的方向前进。

因此,如果我正确理解了您的问题,您希望在节目插入后自动插入电影

因此,您首先需要编写一个
函数来处理插入操作(参考:)

然后编写一个
触发器
,在给定事件发生时执行该函数(参考:)

引用另一篇具有函数示例的帖子

还有一个更全面的参考,包括一个触发器和一个函数


这应该足以帮助你把东西缝合在一起。就要走出家门了,否则我会到处玩,把这些写出来,我当然可以用这个练习。但我希望这足以帮助您朝着正确的方向前进。

以下是我最后所做的:

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;
$$;

要插入我运行的新电影:
选择add_movie('Title','Overview')

以下是我最后做的事情:

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;
$$;

要插入我运行的新电影:
选择add_movie('Title','Overview')

所以,当一行插入到胶片中时,您想自动将记录插入胶片中吗?是的,每当插入表中的新行显示且具有showid=$value时,我想在胶片中插入一行具有showid=$value的新行。所以,当一行插入胶片时,您想自动将记录插入胶片中吗?是的,每当插入到表中的新行显示,并且showid=$value时,我想在films中插入一个新行has showid=$value谢谢您提供的链接,我现在正在阅读它们。我还更新了我的问题,希望能让问题更清楚。所以在查看文档后,我创建了一个函数(在这种情况下,我不认为需要触发器):
CREATE或REPLACE函数add\u movie(mtitle TEXT)返回VOID作为“DECLARE curshowid BIGINT;开始插入显示(标题)值(mtitle),将showid返回到curshowid;插入胶片(showid)值(curshowid);结束;'语言plpgsql
和调用函数:选择add_movie('New movie!');这就是我的解决方案,我想在我把我的线程标记为已解决之前,看看是否有更好的解决方案来做同样的事情。干得好!我很高兴你能处理好它。当您开始处理触发器和函数时,SQL变得非常有趣。我自己几个月前才开始使用它们。唯一可能的缺点是,如果其他人在与数据库交互时不知道设置,他们可能无法完全理解幕后发生的神奇现象。感谢您提供的链接,我现在正在阅读这些链接。我还更新了我的问题,希望能让问题更清楚。所以在查看文档后,我创建了一个函数(在这种情况下,我不认为需要触发器):
CREATE或REPLACE函数add\u movie(mtitle TEXT)返回VOID作为“DECLARE curshowid BIGINT;开始插入显示(标题)值(mtitle),将showid返回到curshowid;插入胶片(showid)值(curshowid);结束;'语言plpgsql
和调用函数:选择add_movie('New movie!');这就是我的解决方案,我想在我把我的线程标记为已解决之前,看看是否有更好的解决方案来做同样的事情。干得好!我很高兴你能处理好它。当您开始处理触发器和函数时,SQL变得非常有趣。我自己几个月前才开始使用它们。唯一可能的缺点是,如果其他人在与数据库交互时不知道设置,他们可能无法完全理解幕后发生的魔力。