代码之家  ›  专栏  ›  技术社区  ›  Sathya

Oracle—在表上没有主键有什么影响吗?

  •  4
  • Sathya  · 技术社区  · 16 年前

    我们在表的主键上使用序列号。 在有些表中,我们没有真正使用主键进行任何查询。 但是,我们在其他列上有索引。这些是非唯一索引。 查询在where条件中使用这些非主键列。

    所以,我真的看不出在这样的表上有主键有什么好处。 我对sql 2000的经验是,它用来复制具有主键的表。 否则就不会。

    我正在使用Oracle 10GR2。我想知道是否有这种副作用 有没有主键的表。

    3 回复  |  直到 11 年前
        1
  •  9
  •   Opus    15 年前

    表不需要主键。表没有显式键对数据库没有任何影响,因为数据库中的每一行都有一个隐式的唯一数据点,Oracle将其用于存储和某些内部引用。这是rowid伪列。rowid是唯一标识数据库中每一行的一段数据,但有一些明显的例外。

    我的数据库上的以下查询返回显示的数据:

    select rowid from user$ where rownum <= 5;
    
    AAAAAKAABAAAAFlAAC
    AAAAAKAABAAAAFlAAD
    AAAAAKAABAAAAFiAAD
    AAAAAKAABAAAAFlAAE
    AAAAAKAABAAAAFlAAF
    

    严格来说,没有必要把钥匙放在桌子上。我刚才查询的oracle10g数据库有569个系统表,它们没有主键或唯一键。dba和开发人员决定如何在数据库表上创建密钥。我的项目中的开发人员总是创建主键,而不管它们是否有用或健全。作为dba,我只在有意义的地方创建键。

    谨致问候,

    作品

        2
  •  6
  •   Andrew not the Saint    16 年前

    在有些表中,我们没有真正使用主键进行任何查询。

    那你为什么要有一个序列,如果你从来没有用过呢? 每个表都必须具有唯一标识记录的内容 ,它不必是一个人工增量序列(又称a surrogate key ,可能是 natural key )中。总有一些查询是通过某种唯一键(候选键)进行访问的,这意味着您肯定需要一个索引,您也可以使索引唯一。

    对所有持久(非临时)表强制pk约束还有其他好处:

    1. 确保永远不会有重复的值(应用程序将无法损坏数据库)
    2. 帮助外部工具执行自动ER建模
    3. 最后但不是最不重要的-允许FK约束!
        3
  •  3
  •   l0b0    16 年前

    在我看来,如果没有唯一的密钥,就不能有外键,因此无法将表链接到其他表。事后更改这一点并不容易,因为访问此表的所有代码都可能受到影响,可能是由于移位引用而根本无法工作,或者是由于执行的方式不同。此外,我相信我们在uni(但这是5年多以前的事了)了解到,独特的索引对性能更好,因为行是不考虑其内容而分段的。