【问题标题】:UNIQUE inside CHECK constraintUNIQUE 内部 CHECK 约束
【发布时间】:2023-03-21 22:29:01
【问题描述】:

这个问题是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 问题中所述。

这可能吗?

【问题讨论】:

    标签: sql oracle check-constraints


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 2021-12-09
      • 2017-08-05
      • 1970-01-01
      相关资源
      最近更新 更多