没有索引的唯一约束

时间:2019-06-12 12:23:53

标签: oracle indexing oracle11g constraints

假设我有一张大桌子。

此表无需查询,我只想在其中保存一段时间。

我想防止表中的行重复,所以我想添加一个唯一的

表上的约束(或PK)。

但是自动创建的唯一索引确实是不必要的。

我不需要它,这只是在浪费磁盘空间,需要维护 (无论创建时间长)。

有没有一种方法可以创建不带索引的唯一约束(任何索引-唯一或不唯一)?

谢谢。

3 个答案:

答案 0 :(得分:3)

否,如果没有相应的索引,您将无法在Oracle中拥有UNIQUE约束。添加约束后会自动创建索引,而任何删除索引的尝试都会导致错误

ORA-02429: cannot drop index used for enforcement of unique/primary key

好运。

编辑

但是您说“假设我有一张大桌子”。那么我们在这里讨论多少行?看吧,1TB SSD不到100美元。四核笔记本电脑的价格不到400美元。如果要通过编写一堆代码来最大程度地减少“存储”或“节省时间”的适用性,以最大程度地减少存储使用或CPU的消耗,我的建议是您在浪费两者 时间金钱。我再说一遍-一张TERABYTE的存储成本与编程时间的一小时相同。品牌推广新计算机的成本与程序员花费的四千小时相同。您要尽一切可能使编码时间最少,而不是传统的CPU时间或磁盘空间优化目标,要好得多。因此,我认为UNIQUE索引是一种低成本解决方案。

答案 1 :(得分:1)

  

但是自动创建的唯一索引确实没有必要。

实际上,Oracle数据库中的UNIQUEness是通过INDEX强制/保证的。这就是为什么您的主键约束带有唯一索引的原因。

根据Docs

唯一键约束和索引 Oracle通过索引强制执行唯一的完整性约束。

enter image description here

答案 2 :(得分:1)

也许您需要Index-Organized Tables
但是严格来说,索引组织表是存储在索引结构中的表-可以说没有表就只有索引,而您的要求是表没有索引,所以相反:)< / p>

CREATE TABLE some_name
(
 col1           NUMBER(10)    NOT NULL,
 col2           NUMBER(10)    NOT NULL,
 col3           VARCHAR2(50)  NOT NULL,
 col4           VARCHAR2(50)  NOT NULL,
 CONSTRAINT pk_locations PRIMARY KEY (col1, col2)
)
ORGANIZATION INDEX