【问题标题】:Conditional unique constraint in oracleoracle中的条件唯一约束
【发布时间】:2012-07-21 12:44:33
【问题描述】:

我目前已将此约束添加到表 MY_TABLE

ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_UNQ_01 UNIQUE (COLUMN1, COLUMN2, COLUMN3) USING INDEX TABLESPACE "MY_TABLE_INDEX";

问题是我添加了一个新列:

ALTER TABLE MY_TABLE ADD (DRAFT NUMBER(1,0));

现在该约束只适用于DRAFT = 0 列

有什么方法可以做到这一点吗?

【问题讨论】:

    标签: database oracle constraints unique-constraint


    【解决方案1】:

    在 11g 中,您可以定义虚拟列的约束:

    ALTER TABLE my_table ADD (
       draft_column1 <DATATYPE> GENERATED ALWAYS AS (DECODE(draft, 0, column1)),
       draft_column2 <DATATYPE> GENERATED ALWAYS AS (DECODE(draft, 0, column2)),
       draft_column3 <DATATYPE> GENERATED ALWAYS AS (DECODE(draft, 0, column3)),
       CONSTRAINT UNQ_02 UNIQUE(draft_column1, draft_column2, draft_column3)
    );
    

    在 10g 和之前的版本中,您可以使用基于函数的唯一索引以及不记录全空索引条目这一事实。所以下面的索引只有在draft=0时才会保证唯一性:

    CREATE UNIQUE INDEX UNQ_03 ON my_table (
       DECODE(draft, 0, column1),
       DECODE(draft, 0, column2),
       DECODE(draft, 0, column3)
    );
    

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 2019-11-02
      • 1970-01-01
      • 2010-10-26
      • 2013-04-20
      • 2021-07-22
      • 2017-07-07
      • 1970-01-01
      相关资源
      最近更新 更多