我目前将此约束添加到表 MY_TABLEALTER 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 时应用

有没有办法做到这一点?

最佳答案

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

关于database - oracle中的条件唯一约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11609856/

10-08 20:47