CHECK 约束中的 UNIQUE

UNIQUE inside CHECK constraint

这个问题是 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 的行是活动的,尽管可以复制非活动行(行的历史视图)。

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

这可能吗?

使用 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 值的行。