2015-04-01 48 views
0

並且提前感謝任何能夠提供幫助的人。我有下面這張表。Postgres,在2列之間創建值的唯一性

表發票


ID | delivery_statement_id | supply_statement_id

_ | 1 | 2

_ | 3 | 4

_ | 2 | 4 < - 不應該傳遞給DB,因爲ID 2已經在第一行中使用。

我想確保唯一的ID兩列之間存在整個數據庫

如果statement_id 1已經使用它永遠無法交付,或供應聲明再次使用。 請幫忙,當我搜索這個問題時,我一直在索引多列,但只解決行組合的問題。

謝謝

+0

您是否生成了id標記,或將它們作爲來自其他來源的輸入? – 2015-04-01 17:22:57

+0

如果您指的是交付和聲明的ID,我正在從數據庫中獲取值。 – 2015-04-06 13:04:06

回答

0

我的理解是,你有以下結構的表:

"invoice" 
(
id (primary key), 
delivery_statement_id, 
supply_statement_id 
) 

從柱的側向承載力的名稱來看,「delivery_statement_id」和「supply_statement_id」是外鍵同樣,外部表...讓我們說,他們指的「說法」

"invoice" 
(
id (primary key), 
delivery_statement_id -> statement(id), 
supply_statement_id -> statement(id) 
) 

如果你有一個表「的聲明」,並要避免多個參照的文從「delivery_statement_id」和「supply_statement_id」國際消費電子展 - 我的建議是「INVOICE_ID」一欄增加了「聲明」表:無參考

"statement" 
(
id (primary key), 
/** some other columns **/ 
invoice_id (nullable, with unique constraint) -> invoice(id) 
) 

所以首先您必須在「聲明」行到任何發票 那麼您設置了delivery_statement_id和supply_statement_id ,並且在設置每個值之後,您必須將其「註冊」到「語句」表中......這可以很容易地實現爲觸發器,附加到「發票」表

+0

嗨Voycheck,你明確的理解了這個問題,但是我發現在語句表中生成invoice_id時發生錯誤。兩條聲明總是指向一張發票,所以唯一約束將失敗。我認爲更好的解決方法是將statement_id留在發票表中,並且每個都在語句表中區分爲交付或供應。這可以通過創建屬性類型或類似布爾delivery_statement(如果比它的供應聲明爲假)來實現。 – 2015-04-06 13:00:30

相關問題