2011-08-28 80 views
9

我正在分析一个Oracle数据库设计,并且在同一个字段上看到唯一键和主键时感到困惑。这些唯一主键对始终在所有表上创建。我没有理由这样做。是否有任何理由在同一个字段上同时使用主键和唯一键?

如果我有一个主键无论如何,是否有一个很好的理由,在同一领域创建一个额外的唯一键?

+1

主键按定义是唯一的,所以我看不到任何理由添加另一个唯一约束/索引 – Phil

回答

1

不,没有理由将它也作为独特的;当您将列设置为PK时,您确定:

  1. 对于INSERT或UPDATE上的该列,不接受NULL;
  2. 整个表中该列的值始终为UNIQUE;

所以刚刚PK就够了。由于PK列具有UNIQUE索引,因此根据定义,不需要在该列上添加任何其他索引,因为只要该列受影响,查询就会使用PK索引。

1

我认为这是不可能的(PK和唯一约束在同一列[S])...

你不能指定列的同一列或组合既作为主键和一个唯一的密钥。

(从here,节 “上主键约束限制”)。不是吗?

1

Oracle不会让您在相同的字段集上以相同的顺序创建多个UNIQUEPRIMARY KEY约束,并且将以ORA-02261失败。

如果您有组合键,您可以在一个订单(PRIMARY KEY (a, b))上设置列设置PRIMARY KEY,并在另一个订单上设置唯一约束(UNIQUE (b, a))。

这将解析并执行,但是单个索引将用于警告两个约束,所以它没有任何意义。

请问您可以发表表格脚本吗?

1

这里只是一个小理论背景......当您的表格建模时,您将识别一组。这些键在逻辑上是相同的,但为了实际目的,您可以选择其中一个,称其为“主”,而其余的则变为“备用”。

在DDL SQL,主键被称为“主键”,而“备用键”被称为“UNIQUE约束”。

所以,在光,你的问题等同于:“是否有一个很好的理由有两个相同的键”,答案是:“否”

话虽这么说,你可能有重叠的键(即共享某些字段但不是所有的键),但是这通常是一个不好的设计的标志......,答案是:“可能不会”


OTOH,如果“唯一键”,您实际上意味着“唯一指数”,那么,你需要他们两个。

索引不是一个逻辑约束 - 它只是允许一个逻辑约束(如PRIMARY KEY)很好地执行(并用于查询,但这是一个不同的主题)。

4

对于解决多对多的表格,通常使用两部分键(如Quassnoi所示)。通过父母双方都需要支持访问的索引也很有可能。

例如,如果您拥有PERSON,ADDRESS和PERSON_ADDRESS表,那么您的PERSON_ADDRESS表可能具有(PERSON_ID,ADDRESS_ID)的主键和支持索引。你也可以在(ADDRESS_ID,PERSON_ID)上有另一个索引,你可能会把它设为一个UNIQUE索引(因为它是一个唯一的字段组合)。

也有可能您的DBA具有生成表的一些特定方式,该方式以主键字段上的UNIQUE索引开始,然后创建PRIMARY KEY约束。这可能会按照您的建议在某些GUI工具中显示。

相关问题