数据库 – 我们可以更新表的主键值吗?

我们可以更新表的主键值吗?
人们普遍同意,primary keys should be immutable(或as stable as possible,因为不可变性不能在DB中执行)。虽然没有什么会阻止您更新主键(完整性约束除外),但可能不是一个好主意:

从性能的角度来看:

>您将需要更新引用更新密钥的所有外键。单个更新可导致更新潜在的许多表/行。
>如果外键是无索引(!!),则必须在子表上保持锁定,以确保完整性。甲骨文只会持有一段时间的锁,但仍然是可怕的。
>如果你的外键被索引(应该是这样),更新将导致索引的更新(在索引结构中删除插入),这通常比基本表的实际更新更昂贵。
>在ORGANIZATION INDEX表中(在其他RDBMS中,请参阅群集主键),这些行按主键进行物理排序。逻辑更新将导致物理删除插入(更昂贵)

其他考虑事项

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

总之,在设计过程中,使用替代键来替代自然主键(通常不应该更改)通常更为安全 – 但是由于需求变化或数据输入错误,最终可能需要更新。

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

http://stackoverflow.com/questions/3838414/can-we-update-primary-key-values-of-a-table

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:数据库 – 我们可以更新表的主键值吗?