您什么时候需要更改主键的值?

时间:2010-02-17 23:42:07

标签: sql foreign-keys primary-key

我一直在阅读外键等postgres,我注意到它允许外键的级联更新。

好吧,我的问题是,您何时需要更新一行的主键?

显然这个家伙需要http://www.oreillynet.com/onlamp/blog/2004/10/hey_sql_fans_check_out_foreign.html,但我不太了解它是如何有用的。

编辑: 我看到了自然主键,如何使用它。但是技术主键怎么样?没有任何意义且几乎总是在插入时自动生成的那些?

7 个答案:

答案 0 :(得分:2)

嗯......我们有很多主键被定义为人类可读的代码。可怕的想法,但在这件事上没有多少选择。

能够修复PK和所有相关记录,当有人意识到拼写错误或意义已经改变时,非常非常方便。

答案 1 :(得分:1)

如果您选择主键作为自然键而不是代理键,则需要执行此操作,然后发现用户更改了姓氏,或者他们在申请表上错误地写了SSN。< / p>

故事的道德:不要使用自然键作为主键。

答案 2 :(得分:1)

当我将PK暴露给第三方系统时,我不得不多次改变我的PK。他们不时打电话给我们要求更改PK,以适应他们数据库中的记录(由于技术问题,两个系统之间的同步 - 不时失败)。

经过几次我们刚刚停止暴露PK并添加一个新列。

答案 3 :(得分:1)

对于像自动增量列这样的合成,无意义的主键,应该(除了少数例外)永远不会有任何理由更新PK值。如果PK是用户可见的值,则可能必须更新它(这是支持合成键的众多参数之一)。这种情况的一个例子是保险单号。在某些情况下,年份是该数字的一部分,并且可能会在每次续订时勾选。在一些数据模型中,记录只是原位更新。

如果发生这种情况,最好使用合成密钥,以便其他项目不依赖于可见数字。

如果要将两个或多个应用程序数据库合并在一起,则需要更新合成密钥的一种可能方案是。在这种情况下,您可能需要整体移动键以避免与来自其他来源的记录键发生冲突。

答案 4 :(得分:1)

如果您使用自然主键,则可能会遇到这种情况。

以下是一个非常新鲜的例子:克罗地亚政府更改了公司和个人的税务识别号码。 2010年1月1日引入了新法律。

去年,我担任过多个项目的顾问,这些项目的公司正在更改自然密钥(旧税号)以代替现有应用程序中的密钥。自然键似乎是这些应用程序的原始设计者的逻辑选择,因为它是由法律定义的。然后它改变了。

答案 5 :(得分:1)

对于自动生成的密钥,我在这里遇到的一个例子(不记得问题)是你需要将两个数据库表合并在一起。在这种情况下,除非您的密钥恰好偏移,否则您可能会有重复项。

答案 6 :(得分:0)

如果使用自然主键(在问题域中具有实际意义的主键),则可能需要执行此操作。如果意思改变了,那么你需要级联改变。

我认为这样的一个不好的例子是学校校园内的建筑物数据库,其中建筑物名称是主键(不要在家里这样做)。如果建筑物被重命名为 bribe ,则尊重新的捐赠者,那么密钥将需要更改。