【问题标题】:Why unique index AND unique constraint (multi columns)?为什么要使用唯一索引和唯一约束(多列)?
【发布时间】:2016-08-23 08:58:55
【问题描述】:

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

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

【问题讨论】:

  • 唯一约束必须由索引备份;尽管它本身必须是独一无二的。两者都有是正常的。它们通常具有相同的名称,但并非总是如此。你当然可以拥有一个没有明确唯一约束的唯一索引。但是约束清楚地表明(对 Oracle 和开发人员而言)这是为了完整性,而不仅仅是为了性能。为什么你认为这是个问题?
  • 同意亚历克斯,但我要补充一点,如果其中的某些内容被视为多余,我会选择索引的唯一性。我宁愿有一个唯一约束和一个非唯一索引而不是没有约束和一个唯一索引。
  • 根据 MSDN 文章technet.microsoft.com/en-us/library/aa224827(v=sql.80).aspx 唯一约束和唯一索引之间没有实际区别,除了唯一约束也被列为数据库中的约束对象。由于无法禁用唯一约束,因此具有约束状态不会为唯一约束提供除唯一索引之外的任何其他行为。但是,有几个索引创建选项不适用于创建唯一约束的 ALTER TABLE 命令。参考文章
  • @Gopidoss - 可以禁用唯一约束(删除索引),也可以推迟,唯一索引不能。无论如何,对于甲骨文来说,问题是什么;不知道 SQL Server...
  • 外键也可以引用唯一键(约束);约束必须存在,仅具有唯一索引是不够的。因此存在实际差异。

标签: oracle constraints unique-constraint


【解决方案1】:

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

管理功能

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

在实践中,约束具有如此大的性能和存储损失,因此必须考虑实施。需要索引,否则单个插入将需要 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);

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

【讨论】:

  • 将唯一约束添加为可延迟也会自动创建非唯一索引。
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 2021-11-02
  • 2015-12-29
  • 2011-03-18
  • 1970-01-01
  • 2023-03-11
  • 2018-12-02
  • 2014-11-28
相关资源
最近更新 更多