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

问题描述:

我们使用序列号为表上的主键。 有些表格我们没有真正使用主键来查询任何目的。 但是,我们在其他列上有索引。这些是非唯一索引。 查询在WHERE条件中使用这些非主键列。Oracle - 在表上没有主键会有什么影响吗?

所以,我真的不明白在这样的表上有一个主键的好处。 我对SQL 2000的经验是,它用于复制有一些主键的表。 否则它不会。

我正在使用Oracle 10gR2。我想知道是否有任何 有没有主键的表的副作用。

关闭我的头顶,你不能有一个没有唯一键的外键,所以没有办法将表链接到其他表。在事实之后改变它并不是微不足道的,因为访问这个表的所有代码都可能受到影响,或者由于移位引用而无法工作,或者以不同的方式执行。另外,我相信我们在uni(但是这是5年前以前)学到独特的索引对性能更好,因为行被分割而不考虑它们的内容。

有一些表我们并不真正使用主键来查询任何目的。

那么为什么你有一个序列,如果你永远不会使用它? 每个表格都必须有一个唯一标识记录的东西,它不需要是人工增量序列(又名surrogate key),它可能是natural key的组合)。总是有一些查询通过某种唯一键(候选键)访问,这意味着你肯定需要一个索引,你也可以使索引唯一。

上有所有持久(非临时)表强制PK限制的其他好处:

  1. 确保你永远不会有重复的值(你的申请将不能够破坏DB )
  2. 帮助外部工具执行自动ER建模
  3. 最后但并非最不重要 - 允许FK约束!
+1

+1报价。 “如果它没有主键,它不是*一张桌子!” :-) – 2009-07-01 20:55:27

+1

允许在Unique上使用外键,因此不需要PK的那个 – 2015-10-18 16:05:26

一个表不需要有主键。因为数据库中的每一行都有一个Oracle用于存储和某些内部引用的隐式唯一数据点,所以对于数据库没有任何影响。这是ROWID伪列。 ROWID是唯一标识数据库中每一行的数据 - 有一些值得注意的例外。

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

 
select rowid from user$ where rownum <= 5; 

AAAAAKAABAAAAFlAAC 
AAAAAKAABAAAAFlAAD 
AAAAAKAABAAAAFiAAD 
AAAAAKAABAAAAFlAAE 
AAAAAKAABAAAAFlAAF 

它不是严格必要在一个表上的一个关键。我刚才查询的Oracle10g数据库有569个没有主键或唯一键的系统表。这是DBA和开发人员应该如何在数据库表上创建密钥的决定。我的项目中的开发人员总是创建主键,而不管他们的用途或理智。作为DBA,我只在有意义的地方创建密钥。

亲切的问候,

作品