【问题标题】:Oracle - Is there any effect of not having a primary key on a table?Oracle - 表上没有主键有什么影响吗?
【发布时间】:2010-11-07 07:20:16
【问题描述】:

我们使用序列号作为表上的主键。 有些表我们并没有真正将主键用于任何查询目的。 但是,我们在其他列上有索引。这些是非唯一索引。 查询在 WHERE 条件中使用这些非主键列。

所以,我真的看不出在这些表上使用主键有什么好处。 我对 SQL 2000 的经验是,它用于复制具有一些主键的表。 否则不会。

我正在使用 Oracle 10gR2。我想知道有没有这样的副作用 有没有主键的表。

【问题讨论】:

    标签: database oracle database-design


    【解决方案1】:

    在我的脑海中,没有唯一键就不能拥有外键,因此无法将表链接到其他表。事后更改它并不是微不足道的,因为访问此表的所有代码都可能会受到影响,要么由于引用移位而根本无法工作,要么执行方式不同。另外,我相信我们在 uni(但这是 5 多年前)了解到,唯一索引对性能更好,因为行被分段而不考虑其内容。

    【讨论】:

      【解决方案2】:

      有些表我们并没有真正将主键用于任何查询目的。

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

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

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

      【讨论】:

      • +1 引用。 “如果它没有主键,那它就是NOT 表!” :-)
      • Uniques 上允许使用外键,因此不需要 PK
      【解决方案3】:

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

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

      从 user$ 中选择 rowid,其中 rownum

      在一张桌子上有一个键并不是绝对必要的。我刚刚查询的 Oracle10g 数据库有 569 个系统表,它们没有主键或唯一键。如何在数据库表上创建键是 DBA 和开发人员的决定。我项目的开发人员总是创建主键,不管它们的用处或健全性如何。作为 DBA,我只在有意义的地方创建密钥。

      亲切的问候,

      作品

      【讨论】:

      • 我认为在表具有瞬态数据的情况下尤其如此,例如数据仓库 ETL/ELT 模式中的情况,或者您只是接受原始数据(例如来自网络设备)的情况而且还真是没有意义的PK。您可以添加一个序列生成的数字,但同样您也可以依赖 ROWID。
      • 我不敢相信这个答案有这么多赞成票。这是一个糟糕的建议。很可能是我们这么多人与遗留数据库集成的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多