为什么唯一索引和唯一约束(多列)?

时间:2016-08-23 08:58:55

标签: oracle constraints unique-constraint

因此,我正在查看的表具有唯一约束和多列的唯一索引,以及两者的完全相同的列。

是否有用途或唯一约束是多余的?

1 个答案:

答案 0 :(得分:1)

我同意唯一约束唯一索引的存在确实看起来多余。这似乎违反了Don不要重复自己,允许混淆差异。但至少存在两个原因 - 管理功能和允许现有重复。

管理功能

理论上,可以创建逻辑约束而无需担心实现。约束指定了必须为真的内容,以及一些选项,例如将约束推迟到提交之前。

在实践中,约束具有如此大的性能和存储损失,必须考虑实现。索引是必需的,否则单个插入将需要O(n)时间而不是O(log(n))。这些索引可占用大量空间;某人可能想要指定它的存储位置,压缩方式等等。

大多数情况下,这些功能并不重要,并且使用所有索引默认值都可以。但有时存储和性能至关重要,人们会想要调整索引而不关心约束。

允许现有重复项

至少有一种情况是唯一约束没有唯一索引。可以允许现有的重复值,但可以通过将约束设置为NOVALIDATE并使用非唯一索引来防止将来出现重复。

--Create table and insert duplicate values.
create table test1(a number);

insert into test1 values(1);
insert into test1 values(1);
commit;

--Add a non-validated unique constraint, with a non-unique index.
alter table test1
add constraint test1_uq unique(a)
using index (create /* Not unique!*/ index test1_uq on test1(a)) novalidate;

--Now multiple inserts raise: ORA-00001: unique constraint (JHELLER.TEST1_UQ) violated
insert into test1 values(2);
insert into test1 values(2);

物理索引必须允许重复,但逻辑约束知道不允许任何更多重复。虽然这是一个罕见的功能,但我不确定我是否曾在生产代码中看到它。