2012-04-25 132 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