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以前では、関数ベースの一意のインデックスと、すべてNULLのインデックスエントリが記録されないという事実を使用できます。したがって、次のインデックスは、次の場合にのみ単一性を保証しますdraft=0
。
CREATE UNIQUE INDEX UNQ_03 ON my_table (
DECODE(draft, 0, column1),
DECODE(draft, 0, column2),
DECODE(draft, 0, column3)
);