如何确定用作另一个表

时间:2016-03-10 03:18:03

标签: sql database postgresql database-schema sql-insert

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

PostgreSQL table design

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

  1. 用户通过表单提交信息。
  2. 将自动生成MainId主键,并将部分用户信息放在表Main中。
  3. 根据用户的输入(Submain中的项目),记录将插入到表格Main中。如何确定用户的主键MainId是什么,以便我可以将其插入Submain.MainId [FK]以获取新记录?
  4. 记录也将插入Subsub,该信息将基于表Submain中的信息。同样,如何确定Submain.Submain [PK]以便我可以将其用作Subsub.Submain [FK]中的外键?
  5. 问题2. MainOther之间存在多对多关系(我省略了关联表)。但是,为了将记录插入表Other,需要Subsub的信息。 SubsubOther之间会有一对一的映射。我是否需要绘制一对一的关系,或者可以根据表Other到表SELECT/JOIN的复杂Main语句填充表Subsub?这可能是一个糟糕的问题,但我认为我需要绘制一对一关系并将外键SubsubId [FK]插入Other而不是尝试复杂的SQL语句。

1 个答案:

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