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の場合にのみ制約が適用されます

これを行う方法はありますか?

4

1 に答える 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以前では、関数ベースの一意のインデックスと、すべてNULLのインデックスエントリが記録されないという事実を使用できます。したがって、次のインデックスは、次の場合にのみ単一性を保証しますdraft=0

CREATE UNIQUE INDEX UNQ_03 ON my_table (
   DECODE(draft, 0, column1),
   DECODE(draft, 0, column2),
   DECODE(draft, 0, column3)
);
于 2012-07-23T09:46:20.330 に答える