Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更新在另一个表中作为外键引用的表的主键?_C#_Sql - Fatal编程技术网

C# 如何更新在另一个表中作为外键引用的表的主键?

C# 如何更新在另一个表中作为外键引用的表的主键?,c#,sql,C#,Sql,假设 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 ke

假设

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)
现在我想知道,当我更改或更新SSN in person表时,其他两个表中的SSN也会相应更改

  • 如果有人能帮我扳机的话
  • 或者如何传递表的外键约束

  • 只需将更新级联添加到外键约束。

    好吧,假设SSN是
    Person
    表的主键,我只想(当然是在事务中):

    • 使用新SSN创建一个全新的行,从旧行复制所有其他详细信息
    • 更新其他表中的列以指向新行
    • 删除旧的行

    这实际上是一个很好的例子,说明了如果数据可以更改,为什么不应该使用实际数据作为表交叉引用。如果您使用一个人工列将它们连接在一起(并且只将SSN存储在一个位置),那么就不会有问题。

    最好是表的主键永远不要更改。如果希望SSN发生更改,则应使用不同的主键,并将SSN作为person表中的正常数据列。如果进行此更改已经太迟,可以将更新级联添加到外键约束。

    如果您有更改的PK,则需要查看表设计,使用代理PK,如标识

    在您的问题中,您有一个
    Person
    表,它可能是许多表的FK。在这种情况下,更新级联上的
    可能会出现一些严重问题。我正在处理的数据库有300多个引用(FK)到我们的等效表,我们跟踪每个人在不同表中所做的所有工作。如果我在Person表中插入一行,然后再次尝试将其删除(该行不会在任何其他表中使用,它是新的),则删除将失败,并出现
    Msg 8621,Level 17,State 2,Line 1查询处理器在查询优化过程中耗尽了堆栈空间。请简化查询。
    因此,我无法想象当您的PK上有许多FK时,更新级联的
    也会起作用


    我绝不会将SSN这样的敏感数据作为PK。医疗保健公司过去常常这样做,但由于隐私问题,他们的转换非常痛苦。我希望您没有web应用程序,而是有一个名为SSN的GET或POST变量,其中包含实际值!!或者在每个报告上显示SSN,或者将所有旧打印的报告撕碎,并限制查看每个报告的人的访问权限等等。

    级联更新和删除使用起来非常危险。如果您有一百万个儿童记录,那么您可能会遇到严重的锁定问题。您应该对更新和删除进行编码

    如果可以避免的话,你不应该使用可能改变的PK。您也不应该将SSN用作PK,因为它永远不应该未加密地存储在数据库中。永远不要,除非你的公司喜欢在身份盗窃事件中被起诉。这不是一个可以忽略的设计缺陷,因为这是遗留问题,我们没有时间修复。这是一个设计缺陷,若有人偷了你们的备份磁带或以另一种方式将SSN从系统中取出,你们的公司可能会破产(顺便说一句,大多数此类盗窃都是内部的)。这是一个急需解决的设计缺陷


    SSN也是一个不好的候选者,因为它会改变(例如,当人们成为身份盗窃的受害者时,人们会改变它们。)加上整数PK比九位数PK的性能更快

    +1提到主键不应代表任何业务细节,以及为询问者提供替代方案。SSN(加拿大的SIN)是一个非常糟糕的PK,因为它们实际上可以根据个人进行更改,此外,并非每个人都会有一个。我认为可以肯定的是,你永远不应该将用户输入用作主键。是的,我没有将其用作主键。但在这种情况下,我不得不这样问:这肯定不是我研究中的主键:)