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

现在约束应该仅在 column 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 及之前的版本中,您可以使用基于函数的唯一索引以及不记录全空索引条目这一事实。因此,以下索引仅在以下情况下才能保证唯一性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 回答