2010-04-14 84 views
3

当我注意到一个有趣的行为时,我在10g中创建了一个新表。这里是我做的一个例子:Oracle独特索引

CREATE TABLE test_table (field_1 INTEGER PRIMARY KEY); 

Oracle将默认为主键创建一个非空的唯一索引。我仔细检查了这一点。快速检查后,我找到一个唯一索引名称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会允许将非唯一索引用于主键约束。为什么这是允许的?

回答

5

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

2

为什么不允许它?我喜欢Oracle给你很多选择和灵活性。

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

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

Oracle将默认创建一个非null唯一索引

呵呵,和索引无关与非空方面。

+0

+1表示非空注释。 – 2010-04-15 05:02:39