这是一个由两部分组成的问题。附件是PostgreSQL数据库表设计的图表。有四个表。表Main
与表Submain
具有一对多关系。表Submain
与表Subsub
具有一对多的关系。所有四个表的主键都是串行非空(因此它们会自动递增)。每个表都有多个未在此处显示的属性。
问题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语句。
答案 0 :(得分:2)
回答Q1:使用data-modifying CTEs并返回带有RETURNING
子句的序列PK:
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 或更高版本 相关答案以及解释和链接: