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

Oracle 为什么是唯一索引和唯一约束(多列)?,oracle,constraints,unique-constraint,Oracle,Constraints,Unique Constraint,因此,我正在查看的表在多个列上有一个唯一的约束和一个唯一的索引,这两个列都是完全相同的 这有什么用,还是唯一约束是多余的?我同意唯一约束和唯一索引的存在一开始看起来确实是多余的。这似乎违反了“不要重复你自己”,允许混淆差异。但两者都存在至少有两个原因——管理特性和允许现有副本 管理功能 理论上,可以创建逻辑约束,而不必担心实现。约束指定必须为true的内容,以及一些选项,例如将约束推迟到提交 实际上,约束会对性能和存储造成很大的损失,因此必须考虑实现。需要索引,否则单个插入将需要O(n)时间而不

因此,我正在查看的表在多个列上有一个唯一的约束和一个唯一的索引,这两个列都是完全相同的


这有什么用,还是唯一约束是多余的?

我同意唯一约束和唯一索引的存在一开始看起来确实是多余的。这似乎违反了“不要重复你自己”,允许混淆差异。但两者都存在至少有两个原因——管理特性和允许现有副本

管理功能

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

实际上,约束会对性能和存储造成很大的损失,因此必须考虑实现。需要索引,否则单个插入将需要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);

物理索引必须允许重复,但逻辑约束知道不允许再重复。尽管这是一个罕见的特性,我不确定我是否在生产代码中见过它。

唯一的约束必须由索引备份;尽管这本身并不一定是独一无二的。两者兼有是正常的。他们通常有相同的名字,但情况并非总是如此。当然,您可以拥有一个唯一的索引,而不需要显式的唯一约束。但这个约束(对Oracle和开发人员)清楚地表明,这是为了完整性,而不仅仅是性能。你为什么认为这是一个问题?同意Alex的观点,但我要补充一点,如果其中的某些内容被认为是多余的,我会选择索引的唯一性。我宁愿有一个唯一的约束和一个非唯一的索引,而不是没有约束和唯一的索引。根据MSDN文章,唯一约束和唯一索引之间没有实际区别,唯一约束也作为约束对象列在数据库中。由于无法禁用唯一约束,因此具有约束状态不会为唯一约束提供唯一索引之外的任何其他行为。但是,有几个索引创建选项对于创建唯一约束的ALTER TABLE命令不可用。参考article@Gopidoss-可以禁用唯一约束(删除索引),也可以延迟,唯一索引不能。无论如何,对于甲骨文来说,这是一个问题;不知道SQL Server…外键也可以引用唯一键(约束);约束必须存在,仅仅有一个唯一的索引是不够的。所以在实际操作中存在差异。添加一个唯一的约束作为可延迟项也会自动创建一个非唯一索引。