2010-05-12 67 views
3

假设一个如何更新在另一个表中引用为外键的表的主键?

Table "Person" having 
    "SSN", 
    "Name", 
    "Address" 

和另一

Table "Contacts" having 
    "Contact_ID", 
    "Contact_Type", 
    "SSN" (primary key of Person) 

同样

Table "Records" having 
    "Record_ID", 
    "Record_Type", 
    "SSN" (primary key of Person) 

现在我想,当我改变或亲自表中相应的变化在其他2个表更新SSN。

  1. 如果有人可以帮助我为
  2. 或者如何触发通过外键约束表

回答

8

只是UPDATE CASCADE添加到外键约束。

1

那么,假设SSN是Person表的主键,我只想(当然,在一个交易):

  • 创建一个全新的行新SSN,复制所有其他细节旧的一排。
  • 更新其他表中的列以指向新行。
  • 删除旧的行。

现在,这实际上是一个很好的例子,说明为什么您不应将实际数据用作表交叉引用(如果数据可能更改)。如果你使用了一个人造的柱子将它们绑在一起(并且只将SSN存储在一个地方),你就不会有问题。

5

最好不要改变表的主键。如果您希望SSN发生变化,您应该使用不同的主键,并将SSN作为人员表中的正常数据列。如果进行此更改已经太迟了,可以将ON UPDATE CASCADE添加到外键约束。

+1

+1提及一个主键不应该代表任何业务细节,并提供一个替代方案的提问者。 – 2010-05-12 12:37:05

4

如果您的PK有变化,您需要查看表格设计,使用代理PK,如身份。

在你的问题你有一个Person表,这可能是许多表的FK。在这种情况下,ON UPDATE CASCADE可能会有一些严重的问题。我正在处理的数据库有超过300个参考文献(FK),我们跟踪每个人在每个不同表格中执行的各种工作。如果我在Person表中插入一行然后尝试再次删除它(它不会用于任何其他表中,则它是新的),删除将失败,结果为Msg 8621, Level 17, State 2, Line 1 The query processor ran out of stack space during query optimization. Please simplify the query.因此,我无法想象ON UPDATE CASCADE当你在PK上获得许多FK时会起作用。

我绝不会像SSN那样使敏感数据成为PK。医疗保健公司曾经这样做过,并且因为隐私而进行了痛苦的转换。我希望你没有一个网络应用程序,并有一个名为SSN的GET或POST变量,其中的实际值!或者在每个报告上显示SSN,或者是否将所有旧的打印报告撕碎,并限制谁查看每个报告。

+0

SSN(加拿大SIN)是一个非常糟糕的PK,因为他们实际上可以相对于个人的变化,除了它不是一个给定的,每个人都将在事实上有一个。 – 2010-05-12 13:54:59

+1

我认为可以肯定地说,你永远不应该使用用户输入作为主键。 – dotjoe 2010-05-12 15:38:57

+0

是的,我没有使用它作为主键。但在这种情况下,我不得不问这样的事情,它不是在我的studd中的PK :) – Mobin 2010-05-14 13:16:23

1

级联更新和删除使用非常危险。如果您有一百万条儿童记录,则最终可能会出现严重的锁定问题。您应该代码更新和删除。

如果可以避免,你绝对不应该使用具有改变潜力的PK。你也不应该使用SSN作为PK,因为它永远不应该在数据库中未加密存储。从来没有,除非你的公司喜欢被起诉,当他们是一个契约盗窃事件的原因。这不是一个设计缺陷,因为这是遗留下来的,我们没有时间去解决。这是一个设计缺陷,可能破产公司,如果有人偷了你的备份磁带或获取核潜艇出以另一种方式的系统正(大多数这类盗窃的是内部BTW)的。这是一个迫切 - 必须修复现在的设计缺陷。

SSN也是一个糟糕的选择,因为它改变了(人们改变他们时,他们是身份盗窃例如受害者。)加上整数PK将有超过九位数的PK更快的性能。

相关问题