2014-03-25 160 views
3

我正面臨以下問題: 我想創建一個獨特和檢查約束的混合體。Oracle約束:混合唯一性和檢查約束條件

這可能比DB的責任更多的業務邏輯,但仍然是。

我有一個表結構如下:

desc INSURANCE; 

Name    Null  Typ   
----------------- -------- ------------- 
ID    NOT NULL NUMBER   
CUST_ID   NOT NULL NUMBER   
CONTRACT_TYPE  NOT NULL NUMBER 
FROM_DATE   NOT NULL DATE   
TO_DATE   NOT NULL DATE 

設計本身可能是錯誤的,這只是一個例子。

我想有這樣一個約束:

alter table INSURANCE 
add constraint unique(CUST_ID, CONTRACT_TYPE) 
and check (FROM_DATE not between FROM_DATE and TO_DATE) 
and check (TO_DATE not between FROM_DATE and TO_DATE) ; 

在口頭上:它允許有兩個保險具有相同CUST_ID和CONTRACT_TYPE,只要時間不互相交叉。

有沒有解決這類問題的方法?

感謝您的任何提示!

Cheers muellae

+1

這是一個不平凡的問題,很容易出錯 - 請參閱http://jeffkemponoracle.com/2012/08/30/non-overlapping-dates-constraint/瞭解選項。 –

回答

1

您可能會想要一個基於函數的約束。我不會在這裏詳細討論,因爲已經有很多資源 - 只是Google的「基於Oracle函數的約束」,你會得到很多。我不想推測性能的影響,但是我認爲你的陳述應該是商業邏輯是100%正確的。不要把廢話數據扔到你的數據庫,在源處拒絕它。

1

您可以使用'before'觸發器。在觸發器代碼中執行您描述的檢查,如果您發現任何現有的行,則引發異常。