2016-03-10 38 views
0

這是一個由兩部分組成的問題。附圖是PostgreSQL數據庫表格設計的圖表。有四張桌子。表Main與表Submain有一對多的關係。表Submain與表Subsub有一對多的關係。所有四個表的主鍵都是串行非空(所以它們自動遞增)。每個表都有多個屬性,這裏沒有顯示。如何確定用作另一個表的外鍵的自動生成的主鍵

PostgreSQL table design

問題1.有多個用戶訪問該應用程序和數據庫。當用戶訪問使用此數據庫的應用程序時,他們的一些信息將存儲在表Main中。隨後的信息(由用戶提供,其他結果基於用戶的輸入)將存儲在表格SubmainSubsub中。我的想法如下:

  1. 用戶通過表單提交信息。
  2. A MainId主鍵將自動生成,部分用戶信息將被放置在表Main中。
  3. 根據用戶的輸入(Main中的項目),將在表Submain中插入一條記錄。如何確定用戶的主鍵MainId是否可以插入到Submain.MainId [FK]中以記錄新記錄?
  4. 還將在Subsub中插入一條記錄,該信息將基於表Submain中的信息。同樣,如何確定Submain.Submain [PK],以便我可以將它用作Subsub.Submain [FK]的外鍵?

問題2:MainOther(我遺漏了關聯表)之間存在多對多關係。但是,要將記錄插入表Other,則需要從Subsub獲取信息。將有SubsubOther之間的一對一映射。我是否需要繪製出一對一的關係,或者可以根據表中的一個複雜的SELECT/JOIN陳述填充表Other,直至表Subsub?這可能是一個糟糕的問題,但我認爲我需要繪製一對一的關係,並將外鍵SubsubId [FK]插入Other而不是嘗試複雜的SQL語句。

+1

一般原則是讓它* *一個每個問題的問題。另外,你的第二個問題似乎不符合你的ER圖。我建議你將這部分分成單獨的問題。並且請始終提供您的Postgres版本。 –

回答

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或更高版本。
相關答案與解釋和鏈接:

相關問題