如何确定用作另一个外键的自动生成的主键 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 Submain
和 Subsub
中。我的思路如下:
- 用户通过表单提交信息。
- 会自动生成一个
MainId
主键,部分用户信息会放在table Main
.
- 一条记录将根据用户的输入(
Main
中的项目)插入到 table Submain
中。我怎样才能确定用户的主键 MainId
是什么,以便我可以将它插入到新记录的 Submain.MainId [FK]
中?
- 一条记录也将被插入
Subsub
,该信息将基于 table Submain
中的信息。同样,如何确定 Submain.Submain [PK]
以便我可以将其用作 Subsub.Submain [FK]
中的外键?
问题2.Main
和Other
之间存在多对多关系(我省略了关联table)。但是,为了将记录插入 table Other
,需要来自 Subsub
的信息。 Subsub
和 Other
之间将存在一对一的映射关系。我是否需要绘制出一对一的关系,或者可以根据从 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
这是一个由两部分组成的问题。附件是 PostgreSQL 数据库 table 设计的图表。有四个 table。 TableMain
与tableSubmain
是一对多的关系。 TableSubmain
与tableSubsub
是一对多的关系。所有四个 table 的主键都是连续的 NOT NULL(因此它们会自动递增)。每个 table 都有此处未显示的多个属性。
问题1.多个用户将访问这个应用程序和数据库。当用户访问使用此数据库的应用程序时,他们的一些信息将存储在 table Main
中。后续信息(由用户提供和基于用户输入的其他结果)将存储在 tables Submain
和 Subsub
中。我的思路如下:
- 用户通过表单提交信息。
- 会自动生成一个
MainId
主键,部分用户信息会放在tableMain
. - 一条记录将根据用户的输入(
Main
中的项目)插入到 tableSubmain
中。我怎样才能确定用户的主键MainId
是什么,以便我可以将它插入到新记录的Submain.MainId [FK]
中? - 一条记录也将被插入
Subsub
,该信息将基于 tableSubmain
中的信息。同样,如何确定Submain.Submain [PK]
以便我可以将其用作Subsub.Submain [FK]
中的外键?
问题2.Main
和Other
之间存在多对多关系(我省略了关联table)。但是,为了将记录插入 table Other
,需要来自 Subsub
的信息。 Subsub
和 Other
之间将存在一对一的映射关系。我是否需要绘制出一对一的关系,或者可以根据从 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