在约束中重用索引

a1e*_*x07 5 oracle

我试图了解 Oracle 如何确定索引是否可用于约束。例如,以下工作:

create table temp11
(id int not null,
val varchar2(10),
CONSTRAINT PK_temp11 primary key (id) using index 
(create index IDX_temp11 ON temp11(id,val))
);
--Also, I can re-use the same index for another unique constraint :
ALTER TABLE temp11 ADD CONSTRAINT UQ_temp11 UNIQUE(id,val) using index IDX_temp11;
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改索引定义并使其唯一,则会出现错误

ORA-14196: 不能使用指定的索引来强制执行约束。

create table temp11
(id int not null,
val varchar2(10),
CONSTRAINT PK_temp11 primary key (id) using index 
(create UNIQUE index IDXU_temp11 ON temp11(id,val))
); -- ORA-14196
Run Code Online (Sandbox Code Playgroud)

** 制作 valnot null没有任何区别。
任何人都可以解释这种行为吗?
我不明白为什么这样的唯一索引不能用于强制约束,而接受非唯一索引。如果重要的话,我会使用 Oracle 10。

Lei*_*fel 8

我理解你对这种行为的不满。实现这一点似乎存在内部障碍,并可能导致索引超出必要范围。

  • 凭借独特的索引支持主键,约束验证完成之前被修改的唯一索引和一个查询可以验证该条目是否可以插入或没有。1

  • 随着非唯一索引支持主键,约束验证完成更改了非唯一索引并提出看起坐需要验证该条目是否可以插入或没有。1

使用唯一索引的前导列的主键将需要对唯一索引的非唯一索引约束逻辑。这将需要对逻辑进行更改和/或添加。

如果 id 是唯一/主要的,则 (id,val) 本质上是唯一的,通常您不需要/不想要 (id,val) 上的唯一约束/索引。

如果有查询引用 (id,val) 并且您想阻止表查找,您可能需要 (id,val) 上的唯一索引。如果这是您的情况,您可能必须决定允许表查找、将主键增加到 (id,val) 或具有两个唯一索引之间的较小权衡。对于大多数情况,我怀疑表查找会更可取。