2012-04-25 128 views
16

我有一種情況,我需要根據另一列值對列[屬性]強制執行唯一約束。oracle db中的條件唯一約束

因此,例如,我有類似於表(ID,EID,名稱,請將isDeleted)的表

請將isDeleted只能有一個值零或「Y」(活性或刪除),並且我想創建一個唯一的EID限制,ISDeleted只有當ISDeleted = null,因爲我不在乎是否有多個刪除記錄具有相同的ID。請注意,EID可以具有空值。

我正在使用Oracle DB進行此操作。

回答

22

您無法創建約束。但是你可以創建一個獨特的基於功能的索引。這利用了Oracle不索引NULL值的事實 - isDeletedNOT NULL的任何行都不會包含在索引中,因此唯一約束將不適用於它們。

CREATE UNIQUE INDEX one_not_deleted 
    ON table_name((CASE WHEN isDeleted IS NULL 
         THEN eid 
         ELSE null 
         END)); 
+0

什麼會'其他空'呢? 它會插入空值還是允許重複的記錄插入? – D3V 2012-04-26 05:29:02

+0

@SantoshPingale - 由於Oracle索引不會索引NULL值,所以'ELSE NULL'會從索引中排除那些允許重複的行。 – 2012-04-26 14:33:09