Oracle唯一索引

时间:2010-04-14 19:12:39

标签: sql oracle oracle10g rdbms

当我注意到一个有趣的行为时,我今天在10g创建了一张新桌子。以下是我所做的一个例子:

CREATE TABLE test_table ( field_1 INTEGER PRIMARY KEY );

默认情况下,Oracle会为主键创建一个非null的唯一索引。我仔细检查过这个。快速检查后,我找到一个唯一的索引名称SYS_C0065645。到目前为止,一切都按预期工作。现在我这样做了:

CREATE TABLE test_table ( field_1 INTEGER,
CONSTRAINT pk_test_table PRIMARY KEY (field_1) USING INDEX (CREATE INDEX idx_test_table_00 ON test_table (field_1)));

在描述我新创建的索引idx_test_table_00之后,我发现它是非唯一的。我尝试将重复数据插入表中,并由主键约束停止,证明该功能未受影响。我觉得很奇怪,Oracle会允许将非唯一索引用于主键约束。为什么允许这样做?

3 个答案:

答案 0 :(得分:5)

唯一索引和非唯一索引之间实际上没有结构差异,Oracle可以使用PK约束。允许这样的PK定义的一个优点是,您可以禁用或推迟数据加载的约束 - 这对于唯一索引是不可能的,因此可以认为此实现更灵活。

答案 1 :(得分:2)

为什么不允许它?我喜欢Oracle为您提供了很多选择和灵活性。

也许您可以创建一个索引并将其用于两个目的:

  • 验证PK
  • 帮助查询更好地执行
  

默认情况下,Oracle会创建一个非null的唯一索引

哦,索引与非null方面无关。

答案 2 :(得分:1)

见Richard Foote的this excellent article about non-unique indexes policing primary keys。理查德表示,在使用非唯一索引时,您将获得性能损失。

换句话说:不要使用非唯一索引来监管主键约束,除非你真的需要约束可以推迟。