我们可以更新表的主键值吗?我们可以更新表的主键值吗?
回答
简答:是的,你可以。当然,您必须确保新值与任何现有值都不匹配,并且满足其他约束条件(duh)。
你究竟想要做什么?
我的猜测是将数据库2合并到数据库1中,其中每个数据库都有一个用户表,并且在这两个表中,相同的用户名具有不同的id(autoincrement id)。 – 2013-06-13 06:08:13
您可以只要
- 的值是唯一
- 没有现有的外键被侵犯
你可以在某些情况下。
但是,您认为这是一个强烈的迹象,表明您的架构存在问题:主键应该是纯技术的,并且不会带来任何业务意义。所以应该永远不需要改变它们。
托马斯
“主键应该是纯粹的技术,没有任何商业含义” - 这是你的意见,而不是事实。代孕与自然辩论尚未结束。 – 2010-10-01 11:52:01
虽然我同意辩论仍然是开放的,但这种情况是代理人的强烈争论。 – DCookie 2010-10-01 14:18:32
人们普遍认为,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。
我想说稳定性更常被引用为PK的理想属性而不是不变性。 [示例](http://stackoverflow.com/questions/3632726/what-are-the-design-criteria-for-primary-keys/3668234#3668234) – 2010-10-01 12:11:53
@Martin:我明白这个区别,但我认为a * physical *主键(即您在数据库中定义的键)应该是不可变的。 *概念数据模型*的主键应该具有来自您提供的链接的答案中给出的属性,但可能与最终的物理主键不同(熟悉例如不是IMO是实际表的主键的条件)。我的回答与物理模型的主要关键有关。 – 2010-10-01 13:04:23
+1,尤其是代理键建议。 – DCookie 2010-10-01 14:16:33
主键属性与表的任何其他属性一样可更新。稳定性往往是一个关键的理想属性,但绝对不是绝对的要求。如果从业务角度来看更新密钥是有意义的,那么没有根本原因你不应该这样做。
从关系数据库理论的角度来看,在更新表的主键时应该绝对没有问题,前提是主键之间没有重复,并且不要尝试将NULL值放入任何主键列。
- 1. 我们可以添加主键破表
- 2. 我们可以更改ServerVariables的值吗?
- 3. 我想用主键的新值更新表的主键
- 4. 我们可以使用匿名方法更新列表吗?
- 5. 我们可以使用主键作为普通列吗?
- 6. 我们可以查询值内的键
- 7. 我们可以在实体框架中没有主键的表吗?
- 8. 我可以在临时表上更改我的主键的数据类型吗?
- 9. 黑莓 - 我们可以使用我们的应用程序更改主题吗?
- 10. 我可以为主键设置ignore_dup_key吗?
- 11. 我可以更新HDFStore吗?
- 12. 是可以更新到空值的自动增量主键值为MySQL表
- 13. 我可以在主键的集群列中有空值吗?
- 14. 我们可以更改功能表中的工作表吗?
- 15. 我可以更新INT值+1并返回新值吗?
- 16. 我们可以更新视图中的真实数据吗?
- 17. 我们可以更新docker的默认配置吗?
- 18. 我们可以更新Angularjs中的JSON文件吗?
- 19. 我们可以连接QPushButton来更改QSlider的值吗?
- 20. 我们可以更改MSMQ的LogMgrFlushInterval值吗?
- 21. 我们可以更新一个radock而不更新完整的radock区域吗?
- 22. 我可以更改NSDictionaries键吗?
- 23. 我们可以删除dom表吗?
- 24. 我们可以为wordpress创建表吗?
- 25. 我们可以在Bigquery中增加更新配额吗?
- 26. 我们可以在elasticsearch中更新角色吗?
- 27. 我们可以在Coldfusion中更新会话吗?
- 28. 我们可以一起选择并更新到数据库吗?
- 29. 我可以更改Environment.NewLine的价值吗?
- 30. 我可以拥有没有聚集索引的主键吗?我也可以拥有多值聚簇索引吗?
你为什么要这么做? – Rene 2010-10-01 13:42:12