Oracle 中的条件唯一约束

4

我当前已经在表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时才适用

有没有办法实现这一点?

1个回答

8
在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)
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接