1

考虑一个对字段 a、b 和 c 具有唯一约束的表。例如像

create table my_tbl (
  a number,
  b number,
  c varchar2(10),
  ...
  constraint constr_name_u unique(a,b,c)
);

现在我想修改约束,使得 b < a 的行不需要是唯一的。这意味着我只想允许 b < a 的行具有非唯一性。所有其他行仍然必须是唯一的。

我怎样才能创建这样一个“宽松”的独特约束?

4

1 回答 1

3

您不能在约束中编写该逻辑。

但是,您可以创建一个唯一的基于函数的索引,这可能让您完成相同的任务

CREATE UNIQUE INDEX idx_my_table
    ON my_table ( CASE WHEN a <= b THEN a ELSE NULL END,
                  CASE WHEN a <= b THEN b ELSE NULL END,
                  CASE WHEN a <= b THEN c ELSE NULL END );

这利用了 Oracle 不会NULL在索引结构中完全存储值的事实。这使您可以根据需要拥有任意多的 b < a 行,并且它们都不会存储在索引结构中。

于 2013-06-21T20:06:43.407 回答