2017-06-12 79 views
0

我有一個表格「節假日」,代表人們的假期。它包含一個FK表,一個起始日期列和一個日期列。我想添加一個約束,以便沒有人可以與他們自己重疊假期。因此,如果比利在1月15日至20日舉行滑雪假期,他不能在1月18日再度假?但他在1月21日這樣做可以嗎?數據庫中的日期範圍唯一約束條件

這是可能的在數據庫級通過約束?

DB2或Oracle可以滿足嗎?

謝謝

+0

對於不同的DBMS,答案會不同。請將您的問題限制在DB2或Oracle。 –

回答

1

您可以創建一個存儲過程,它至少包含當前行的datestart和dateend,並使用它們的參數。如果表中存在一個不良範圍,否則此過程返回1.然後,當此結果過程= 0時,創建約束檢查。

1

不直接。約束條件(至少在Oracle中,我不能說其他數據庫)一次只能處理一行,它們不會查看其他行 - 除了跨行查看的UNIQUE約束之外。

所以 - 兩種解決方案。一個是,而不是存儲範圍,每個節日DAY存儲一行。 (順便說一句,我相信你所說的「假期」至少在美國是所謂的「假期」,「假日」是爲公共假期保留的,對所有人來說都是如此,如新年或聖誕節等)。這種安排,在(person_id,vacation_day)上添加一個UNIQUE約束。然後重新處理您的輸入和報告應用程序,將範圍轉換爲單獨的日期,並分別從單獨的日期轉換爲範圍。

如果你必須存儲範圍,另一個解決方案是創建一個帶有提交時刷新的物化視圖(如果條件允許,最好快速刷新),它顯示person_id和vacation_day,每天一行 - 並放置一個UNIQUE約束在物化視圖上。

+0

在Postgres中你可以創建這樣一個約束。 –

+0

@a_horse_with_no_name - 不是我的一杯牛奶! :-) – mathguy

2

在DB2中可以使用時態表和時間旅行查詢 - 檢查出doumentation

使用業務的時間與業務週期中的時表將允許定義哪些強制執行期間不重複的索引

CREATE UNIQUE INDEX I_vacation ON vacation (person, BUSINESS_TIME WITHOUT OVERLAPS)