如何确定用作另一个外键的自动生成的主键 table

How to determine the auto-generated primary key used as a foreign key for another table

这是一个由两部分组成的问题。附件是 PostgreSQL 数据库 table 设计的图表。有四个 table。 TableMain与tableSubmain是一对多的关系。 TableSubmain与tableSubsub是一对多的关系。所有四个 table 的主键都是连续的 NOT NULL(因此它们会自动递增)。每个 table 都有此处未显示的多个属性。

问题1.多个用户将访问这个应用程序和数据库。当用户访问使用此数据库的应用程序时,他们的一些信息将存储在 table Main 中。后续信息(由用户提供和基于用户输入的其他结果)将存储在 tables SubmainSubsub 中。我的思路如下:

  1. 用户通过表单提交信息。
  2. 会自动生成一个MainId主键,部分用户信息会放在table Main.
  3. 一条记录将根据用户的输入(Main 中的项目)插入到 table Submain 中。我怎样才能确定用户的主键 MainId 是什么,以便我可以将它插入到新记录的 Submain.MainId [FK] 中?
  4. 一条记录也将被插入 Subsub,该信息将基于 table Submain 中的信息。同样,如何确定 Submain.Submain [PK] 以便我可以将其用作 Subsub.Submain [FK] 中的外键?

问题2.MainOther之间存在多对多关系(我省略了关联table)。但是,为了将记录插入 table Other,需要来自 Subsub 的信息。 SubsubOther 之间将存在一对一的映射关系。我是否需要绘制出一对一的关系,或者可以根据从 table Main 到 table Other 的复杂 SELECT/JOIN 语句填充tableSubsub?这可能是一个糟糕的问题,但我认为我需要绘制一对一关系并将外键 SubsubId [FK] 插入 Other 而不是尝试复杂的 SQL 语句。

问题 1 的答案:使用 data-modifying CTEs 和 return 带有 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 或更高版本。
带有解释和链接的相关答案:

  • Insert data in 3 tables at a time using Postgres
  • PostgreSQL store value returned by RETURNING