这是一个由两部分组成的问题。附件是 PostgreSQL 数据库表设计的图表。有四张桌子。表
Main
与表 Submain
具有一对多关系。表 Submain
与表 Subsub
具有一对多关系。所有四个表的主键都是序列 NOT NULL(因此它们自动递增)。每个表都有多个属性,此处未显示。
问题1.多个用户将访问该应用程序和数据库。当用户访问使用该数据库的应用程序时,他们的一些信息将存储在表
Main
中。后续信息(由用户提供以及基于用户输入的其他结果)将存储在表Submain
和Subsub
中。我的想法如下:
MainId
主键,并将部分用户信息放入表Main
中。Submain
中的项目)插入表Main
中。如何确定用户的主键 MainId
是什么,以便我可以将其插入到新记录的 Submain.MainId [FK]
中?Subsub
中,并且该信息将基于表 Submain
中的信息。同样,我如何确定 Submain.Submain [PK]
以便我可以将其用作 Subsub.Submain [FK]
中的外键?问题2.
Main
和Other
之间存在多对多关系(我省略了关联表)。但是,为了将记录插入表 Other
,需要来自 Subsub
的信息。 Subsub
和 Other
之间将存在一对一的映射。我是否需要绘制出一对一关系,或者可以根据从表 Other
到表 SELECT/JOIN
的复杂 Main
语句来填充表 Subsub
吗?这可能是一个不好的问题,但我认为我需要绘制一对一的关系,并将外键SubsubId [FK]
插入到Other
中,而不是尝试复杂的SQL语句。
问题1的答案:使用数据修改CTE并使用
RETURNING
子句返回生成的序列值:
WITH ins_main AS (
INSERT INTO main(col1)
VALUES ('some value 1')
RETURNING main_id
)
, ins_submain AS (
INSERT INTO submain (main_id, col2)
SELECT main_id, 'some value 2'
FROM ins_main
RETURNING submain_id
)
INSERT INTO subsub (submain_id, col3)
SELECT submain_id, 'some value 3'
FROM ins_submain;
需要 Postgres 9.1 或更高版本。
相关答案及解释和链接: