【发布时间】:2012-01-26 03:19:50
【问题描述】:
参考:Oracle documentation“Oracle 数据库使用索引强制所有 PRIMARY KEY 约束”
Q的
1> 我不明白有一个约束和一个键的原因(这也将实现约束,即在这种情况下 PRIMARY KEY 约束和 PRIMARY KEY 索引)?
2> 在构建数据库表时我应该实现键还是约束?
3> 是否有任何情况下使用其中一个会成为 +ve/-ve 因素?
【问题讨论】:
参考:Oracle documentation“Oracle 数据库使用索引强制所有 PRIMARY KEY 约束”
Q的
1> 我不明白有一个约束和一个键的原因(这也将实现约束,即在这种情况下 PRIMARY KEY 约束和 PRIMARY KEY 索引)?
2> 在构建数据库表时我应该实现键还是约束?
3> 是否有任何情况下使用其中一个会成为 +ve/-ve 因素?
【问题讨论】:
我不确定我是否理解了这个问题。
在 Oracle 中,当您声明主键约束时,如果不存在合适的索引来强制执行该约束,Oracle 将隐式创建一个索引来强制执行该约束。这不是您创建一个或另一个的“非此即彼”的情况——您总是会同时拥有一个主键约束和一个索引来强制执行该约束。
您可以选择是在创建约束之前单独创建索引并告诉 Oracle 使用索引来强制执行约束,还是允许 Oracle 隐式创建索引。通常,您选择哪种方法并不重要,但有一些事情需要注意。
一个创建非唯一复合索引的示例,该索引的名称与主键约束不同,然后用于强制主键约束。
SQL> create table foo( col1 number, col2 number );
Table created.
Elapsed: 00:00:00.01
SQL> create index idx_foo on foo( col1, col2 );
Index created.
Elapsed: 00:00:00.00
SQL> alter table foo
2 add constraint pk_foo
3 primary key( col1 )
4 using index idx_foo;
Table altered.
Elapsed: 00:00:00.13
【讨论】:
1) 我知道的几乎所有数据库管理系统都通过创建唯一索引来实现主键约束。这是“最简单”的方法,否则如何有效地防止重复条目?
2) “在构建数据库表时我应该实现键还是约束?”是什么意思? “包含”有很多含义:主键、检查、默认、唯一......并非所有这些都强制创建索引。没有“一件事”或“另一件事”的决定,这取决于您要实现的目标。
【讨论】: