内部唯一检查约束

时间:2018-10-17 12:36:01

标签: sql oracle check-constraints

这个问题是An IF inside a check constraint SQL的新变化。我想做类似以下检查的事情(抛出ORA-00936: missing expression异常):

ALTER TABLE t_table
    ADD CONSTRAINT chk_unique_active CHECK
    ( 
        ( tb_active = 0 ) OR  
        ( tb_active = -1 AND UNIQUE(tb_active, tb_img, tb_objid)) 
    );

(在DBMS级别上)必须确保目标对象只有一个具有相同objid的行是活动的,尽管可以复制非活动的行(这些行的历史视图)。

这可以在触发器中完成,但是使用{em> check 似乎更好,如UNIQUE constraint vs checking before INSERT问题中所述。

这可能吗?

1 个答案:

答案 0 :(得分:5)

使用unique索引执行此操作:

create unique index unq_table_active 
    on ( (case when tb_active = -1 then tb_img end),
         (case when tb_active = -1 then tb_objid end)
       ) 

Oracle允许在唯一索引中具有NULL值的多行。