实现约束或密钥?[数据库]

时间:2012-01-25 19:05:48

标签: database oracle

参考:Oracle documentation" Oracle数据库使用索引强制执行所有PRIMARY KEY约束"

Q&#39>

1>我不明白有一个约束和一个密钥背后的原因(也会实现约束,即在这种情况下PRIMARY KEY约束和PRIMARY KEY索引)?

2 - ;构建数据库表时应该实现密钥还是约束?

3>是否有任何情况下使用一个而不是另一个是+ ve / -ve因子?

2 个答案:

答案 0 :(得分:2)

我不确定我是否理解这个问题。

在Oracle中,当您声明主键约束时,如果没有合适的索引来强制执行约束,Oracle将隐式创建一个索引来强制执行该约束。它不是“或者/或”的情况,你创建一个或另一个 - 你总是会同时拥有主键约束和强制该约束的索引。

您可以选择是在创建约束之前单独创建索引,还是告诉Oracle使用索引来强制执行约束,或者是否允许Oracle隐式创建索引。一般来说,选择哪种方法并不重要,但有些事情需要注意。

  1. 如果首先创建索引,则可以执行指定索引所在的表空间等操作。这样做没有性能优势,但有些DBA更喜欢将表空间组织成单独的表和索引。 / LI>
  2. 如果首先创建索引,将来删除约束将不会删除索引。这可能是好的也可能是坏的,这取决于放弃约束的人所期望的。但是,保持一致是有用的,这样如果有人需要在将来放弃约束,所有约束的行为都相似。
  3. 如果首先创建索引,则可以使用涉及其他列的索引来强制执行主键。例如,如果您知道要在主键和其他列上使用复合索引,则可以使用该索引强制执行主键,而不是创建可能的冗余索引,即
  4. 如果Oracle隐式创建索引,则索引名称将与约束名称匹配。如果首先手动创建索引,则名称可能不同。从技术上讲,这些名称是否匹配并不重要,但您可能拥有依赖名称匹配的脚本来将约束链接到索引。
  5. 创建一个非唯一复合索引的示例,其名称与主键约束的名称不同,然后用于强制执行主键约束。

    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 :(得分:0)

1) 我所知道的几乎所有数据库管理系统都是通过创建uniqe索引来实现主键约束。这是“最简单”的方法,如何有效地防止重复的条目?

2)你是什么意思“我应该在构建数据库表时实现密钥还是约束?” “Containts”有很多含义:主键,检查,默认,唯一......并非所有这些都强制创建索引。没有“一件事”或“另一件事”的决定,这取决于你想要实现的目标。