因此,我正在查看的表具有唯一约束和多列的唯一索引,以及两者的完全相同的列。
是否有用途或唯一约束是多余的?
答案 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);
物理索引必须允许重复,但逻辑约束知道不允许任何更多重复。虽然这是一个罕见的功能,但我不确定我是否曾在生产代码中看到它。