我们可以更新表的主键值吗?

时间:2010-10-01 10:40:51

标签: database oracle primary-key

我们可以更新表的主键值吗?

6 个答案:

答案 0 :(得分:35)

人们普遍认为primary keys should be immutable(或as stable as possible因为不能在DB中强制实施不变性。虽然没有任何东西可以阻止您更新主键(完整性约束除外),但这可能不是一个好主意:

从表现的角度来看:

  • 您需要更新引用更新密钥的所有外键。单个更新可能会导致更新可能的大量表/行。
  • 如果外键未编入索引(!!),则必须对子表保持锁定以确保完整性。 Oracle只会在很短的时间内锁定,但这仍然很可怕。
  • 如果您的外键被索引(应该是),则更新将导致索引的更新(在索引结构中删除+插入),这通常比基表的实际更新更昂贵。
  • 在ORGANIZATION INDEX表中(在其他RDBMS中,请参阅聚簇主键),行按主键进行物理排序。逻辑更新将导致物理删除+插入(更昂贵)

其他考虑因素:

  • 如果在任何外部系统(应用程序缓存,另一个数据库,导出...)中引用此密钥,则更新时将引用该引用。
  • 另外,有些RDBMS不支持CASCADE UPDATE,in particular Oracle

总之,在设计过程中,使用代理键代替应该不会改变的自然主键通常更安全 - 但最终可能因需求更改甚至数据输入错误而需要更新。

如果您必须使用子表更新主键,请参阅this post by Tom Kyte for a solution

答案 1 :(得分:10)

主键属性与表的任何其他属性一样可更新。稳定性通常是关键的理想属性,但绝对不是绝对要求。如果从业务角度更新密钥是有意义的,那么没有根本原因你不应该这样做。

答案 2 :(得分:5)

你可以只要

  • 值是唯一的
  • 没有违反现有外键

答案 3 :(得分:2)

简短回答:是的,你可以。当然,您必须确保新值与任何现有值不匹配,并且满足其他约束(duh)。

你究竟想做什么?

答案 4 :(得分:2)

从关系数据库理论的角度来看,更新表的主键应该绝对没有问题,只要主键之间没有重复,并且您不尝试将NULL值放入任何表中。主键列。

答案 5 :(得分:1)

在某些情况下,你可以。

但是您认为这是一个强烈的迹象,表明您的架构存在问题:主要密钥应该是纯粹的技术,并且没有任何商业意义。所以永远不需要改变它们。

托马斯