当我注意到一个有趣的行为时,我今天在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会允许将非唯一索引用于主键约束。为什么允许这样做?
答案 0 :(得分:5)
唯一索引和非唯一索引之间实际上没有结构差异,Oracle可以使用PK约束。允许这样的PK定义的一个优点是,您可以禁用或推迟数据加载的约束 - 这对于唯一索引是不可能的,因此可以认为此实现更灵活。
答案 1 :(得分:2)
为什么不允许它?我喜欢Oracle为您提供了很多选择和灵活性。
也许您可以创建一个索引并将其用于两个目的:
默认情况下,Oracle会创建一个非null的唯一索引
哦,索引与非null方面无关。
答案 2 :(得分:1)
见Richard Foote的this excellent article about non-unique indexes policing primary keys。理查德表示,在使用非唯一索引时,您将获得性能损失。
换句话说:不要使用非唯一索引来监管主键约束,除非你真的需要约束可以推迟。