考虑一个对字段 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 的行具有非唯一性。所有其他行仍然必须是唯一的。
我怎样才能创建这样一个“宽松”的独特约束?
考虑一个对字段 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 的行具有非唯一性。所有其他行仍然必须是唯一的。
我怎样才能创建这样一个“宽松”的独特约束?
您不能在约束中编写该逻辑。
但是,您可以创建一个唯一的基于函数的索引,这可能让您完成相同的任务
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 行,并且它们都不会存储在索引结构中。