2013-06-21 61 views
1

考慮一個對字段a,b和c具有唯一約束的表。例如像如何配置具有異常的唯一約束?

create table my_tbl (
    a number, 
    b number, 
    c varchar2(10), 
    ... 
    constraint constr_name_u unique(a,b,c) 
); 

現在我要修改的約束,使得其中b <一個不需要行是唯一的。這意味着我只允許非唯一性的行,其中b < a。所有其他行仍然必須是唯一的。

我該如何創建這種'放鬆'的獨特約束?

+0

另一個基於函數的獨特索引示例:http://stackoverflow.com/questions/6702367/oracle-function-based-index-selective-uniqueness – maxschlepzig

回答

3

您無法在約束中編寫該邏輯。

您可以創建一個獨特的基於函數的索引,但是,這可能讓你完成相同的任務

CREATE UNIQUE INDEX idx_my_table 
    ON my_table (CASE WHEN a <= b THEN a ELSE NULL END, 
        CASE WHEN a <= b THEN b ELSE NULL END, 
        CASE WHEN a <= b THEN c ELSE NULL END); 

這需要的事實,即甲骨文不會存儲在索引結構完全NULL值。這可以讓你擁有儘可能多的行,並且你不需要將它們存儲在索引結構中。