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

Sql 如何确定自动生成的主键用作另一个表的外键,sql,database,postgresql,database-schema,sql-insert,Sql,Database,Postgresql,Database Schema,Sql Insert,这是一个由两部分组成的问题。附件是PostgreSQL数据库表设计图。有四张桌子。表Main与表Submain具有一对多关系。表submin与表subsubsub具有一对多关系。所有四个表的主键都不是空的(因此它们是自动递增的)。每个表都有多个此处未显示的属性 问题1。多个用户将访问此应用程序和数据库。当用户访问使用此数据库的应用程序时,他们的一些信息将存储在表Main中。后续信息(由用户提供以及基于用户输入的其他结果)将存储在表submin和subsubsub中。我的想法如下: 用户通过表单

这是一个由两部分组成的问题。附件是PostgreSQL数据库表设计图。有四张桌子。表
Main
与表
Submain
具有一对多关系。表
submin
与表
subsubsub
具有一对多关系。所有四个表的主键都不是空的(因此它们是自动递增的)。每个表都有多个此处未显示的属性

问题1。多个用户将访问此应用程序和数据库。当用户访问使用此数据库的应用程序时,他们的一些信息将存储在表
Main
中。后续信息(由用户提供以及基于用户输入的其他结果)将存储在表
submin
subsubsub
中。我的想法如下:

  • 用户通过表单提交信息
  • 将自动生成
    MainId
    主键,一些用户信息将放在表
    Main
  • 将根据用户的输入(主
    Main
    中的项目)在表
    submin
    中插入一条记录。如何确定用户的主键
    MainId
    ,以便将其插入新记录的
    submin.MainId[FK]
  • 一条记录也将被插入到
    subsubsub
    中,该信息将基于表
    submin
    中的信息。类似地,如何确定
    submin.submin[PK]
    ,以便将其用作
    Subsub.submin[FK]
    中的外键
  • 问题2。
    Main
    Other
    之间存在多对多关系(我省略了关联表)。但是,为了将记录插入表
    Other
    ,需要从
    子项
    中获取信息。
    Subsub
    Other
    之间将有一对一的映射。我是否需要绘制一对一关系,或者是否可以基于复杂的
    SELECT/JOIN
    语句从table
    Main
    向下到table
    subsubsub
    填充table
    Other
    ?这可能是一个糟糕的问题,但我认为我需要绘制一个一对一的关系,并将外键
    subsubsubid[FK]
    插入
    Other
    ,而不是尝试复杂的SQL语句。

    回答问题1:使用并返回带有
    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;
    
    需要博士后9.1或更高版本。
    相关答案及解释和链接:

    对Q1的回答:使用并返回带有
    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;
    
    需要博士后9.1或更高版本。
    相关答案及解释和链接:


    一般原则是每个问题一个问题。另外,您的第二个问题似乎与ER图不匹配。我建议你把那部分分成单独的问题。请始终提供您的博士后版本。一般原则是每个问题一个问题。另外,您的第二个问题似乎与ER图不匹配。我建议你把那部分分成单独的问题。请始终提供您的Postgres版本。