2010-10-01 66 views

回答

2

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

你究竟想要做什么?

+0

我的猜测是将数据库2合并到数据库1中,其中每个数据库都有一个用户表,并且在这两个表中,相同的用户名具有不同的id(autoincrement id)。 – 2013-06-13 06:08:13

3

您可以只要

  • 的值是唯一
  • 没有现有的外键被侵犯
1

你可以在某些情况下。

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

托马斯

+2

“主键应该是纯粹的技术,没有任何商业含义” - 这是你的意见,而不是事实。代孕与自然辩论尚未结束。 – 2010-10-01 11:52:01

+1

虽然我同意辩论仍然是开放的,但这种情况是代理人的强烈争论。 – DCookie 2010-10-01 14:18:32

29

人们普遍认为,primary keys should be immutable(或as stable as possible因为不变性无法在DB执行)。虽然没有什么会阻止你更新了主键(除完整性约束),它可能不是一个好主意:

从性能上来看:

  • 您将需要更新所有引用更新密钥的外键。单个更新可能会导致更新潜在的大量表/行。
  • 如果外键是未索引的(!!),您必须在子表上保留一个锁以确保完整性。甲骨文只会在短时间内保持锁定状态,但这仍然是可怕的。
  • 如果您的外键被索引(因为它们应该是),更新将导致更新索引(在索引结构中删除+插入),这通常比基表的实际更新更昂贵。
  • 在ORGANIZATION INDEX表中(在其他RDBMS中,请参阅集群主键),行通过主键进行物理排序。一个合乎逻辑的更新将导致物理删除+插入(更贵)

其他注意事项:

  • 如果该键在任何外部系统引用(应用程序缓存,另一个DB,出口... ),更新时参考将被破坏。另外,有些RDBMS不支持CASCADE UPDATE,in particular Oracle

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

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

+2

我想说稳定性更常被引用为PK的理想属性而不是不变性。 [示例](http://stackoverflow.com/questions/3632726/what-are-the-design-criteria-for-primary-keys/3668234#3668234) – 2010-10-01 12:11:53

+0

@Martin:我明白这个区别,但我认为a * physical *主键(即您在数据库中定义的键)应该是不可变的。 *概念数据模型*的主键应该具有来自您提供的链接的答案中给出的属性,但可能与最终的物理主键不同(熟悉例如不是IMO是实际表的主键的条件)。我的回答与物理模型的主要关键有关。 – 2010-10-01 13:04:23

+0

+1,尤其是代理键建议。 – DCookie 2010-10-01 14:16:33

6

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

2

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

相关问题