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