【问题标题】:To implement constraint or key ?[Databases]实现约束或键?[数据库]
【发布时间】:2012-01-26 03:19:50
【问题描述】:

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

Q的

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

2> 在构建数据库表时我应该实现键还是约束?

3> 是否有任何情况下使用其中一个会成为 +ve/-ve 因素?

【问题讨论】:

    标签: database oracle


    【解决方案1】:

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

    在 Oracle 中,当您声明主键约束时,如果不存在合适的索引来强制执行该约束,Oracle 将隐式创建一个索引来强制执行该约束。这不是您创建一个或另一个的“非此即彼”的情况——您总是会同时拥有一个主键约束和一个索引来强制执行该约束。

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

    1. 如果您首先创建索引,则可以执行诸如指定索引将驻留的表空间之类的操作。这不会带来性能优势,但一些 DBA 更喜欢将表空间组织为分隔表和索引。
    2. 如果先创建索引,以后删除约束不会删除索引。这可能是好是坏,这取决于放弃约束的人的期望。但是,保持一致是很有用的,这样如果将来有人需要放弃约束,所有约束的行为都会相似。
    3. 如果先创建索引,则可以使用涉及其他列的索引来强制执行主键。例如,如果您知道要在主键和其他列上创建复合索引,则可以使用该索引来强制执行主键,而不是创建潜在的冗余索引,即
    4. 如果 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】:

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

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

    【讨论】:

    • 好吧,我绝对知道这是“最简单”的方式,也是拥有主键的目的。当文档“约束”和“关键”中提到这两个术语时,我感到困惑。我的理解是约束更像是一个数据库概念,键是实现约束的实际手段。
    猜你喜欢
    • 2011-04-09
    • 2015-05-17
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    相关资源
    最近更新 更多