有没有理由在同一个字段上同时使用主键和唯一键?

时间:2011-08-28 22:49:20

标签: oracle

我正在分析Oracle数据库设计,我很困惑地看到相同字段上的唯一键和主键。这些唯一主键对始终在所有表上创建。我认为没有理由这样做。

如果我还有主键,是否有充分的理由在同一个字段上创建额外的唯一键?

5 个答案:

答案 0 :(得分:4)

对于解析多对多的表,通常会有一个两部分键(如Quassnoi所示)。它也很可能需要支持通过父母访问的索引。

例如,如果您有PERSON,ADDRESS和PERSON_ADDRESS表,则PERSON_ADDRESS表可能具有(PERSON_ID,ADDRESS_ID)主键和支持索引。你还可以在(ADDRESS_ID,PERSON_ID)上有另一个索引,你可能会把它变成一个独特的索引(因为它是一个独特的字段组合)。

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

答案 1 :(得分:1)

不,没有理由让它也是独一无二的;当您将列设置为PK时,您确定:

  1. INSERT或UPDATE上的该列不接受NULL;
  2. 该列的整个表中的值始终为UNIQUE;
  3. 所以只是PK就足够了。由于PK列有一个UNIQUE索引,根据定义,不需要在该列上添加任何其他索引,因为只要该列受到影响,查询就会使用PK索引。

答案 2 :(得分:1)

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

  

您不能将同一列或列组合指定为主键和唯一键。

(来自here,“对主键约束的限制”部分)。不是吗?

答案 3 :(得分:1)

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

如果您有复合键,则可以按一个顺序(PRIMARY KEY)在列集上创建PRIMARY KEY (a, b),在另一个订单(UNIQUE (b, a))上创建唯一约束。

这将解析并执行,但是单个索引将用于监控两个约束,因此没有任何意义。

请你发表表脚本吗?

答案 4 :(得分:1)

这里只是一点理论背景......在对表进行建模时,您会识别一组。这些键在逻辑上是等价的,但出于实际目的,你选择其中一个并将其称为“主要”,而其余的则变为“备用”。

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

因此,鉴于此,您的问题相当于:“是否有充分的理由拥有两个相同的密钥”,答案是:“不”

话虽如此,你可能有重叠的键(即共享某些字段但不是全部的键),但这通常是设计不良的标志......答案是:< strong>“可能不是”。


OTOH,如果用“唯一键”,你实际上是指“唯一的索引”,那么是的,你需要它们。

索引不是一个逻辑约束 - 它只是允许一个逻辑约束,如PRIMARY KEY表现良好(和查询,但这是一个不同的主题)。