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

问题描述 投票:0回答:1

这是一个由两部分组成的问题。附件是 PostgreSQL 数据库表设计的图表。有四张桌子。表

Main
与表
Submain
具有一对多关系。表
Submain
与表
Subsub
具有一对多关系。所有四个表的主键都是序列 NOT NULL(因此它们自动递增)。每个表都有多个属性,此处未显示。

问题1.多个用户将访问该应用程序和数据库。当用户访问使用该数据库的应用程序时,他们的一些信息将存储在表

Main
中。后续信息(由用户提供以及基于用户输入的其他结果)将存储在表
Submain
Subsub
中。我的想法如下:

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

问题2.

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

sql database postgresql database-schema sql-insert
1个回答
3
投票

问题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 或更高版本。
相关答案及解释和链接:

© www.soinside.com 2019 - 2024. All rights reserved.