如何级联更新2外键未设置为级联的表?

时间:2011-02-23 09:19:46

标签: sql sql-server

我有两张桌子。他们有外键关系。但是外键未设置为更新级联。现在我想更新表的主键。由于FK,SQL Server总是阻止我这样做。我怎么能在SQL命令中做到这一点?我没有权利修改FK。

感谢。

3 个答案:

答案 0 :(得分:0)

你为什么要这样做?它让我觉得有潜在危险。 您的SQL需要先更新相关表,然后将链接返回到PK表并存储受影响的记录的ID。然后你可以更新PK表中的PK。然后返回并更新相关表中的FK。

答案 1 :(得分:0)

根据现有行的属性值创建新行,但使用新键值。对所有引用表执行相同操作。然后,使用新的旧键值,从引用表中删除行,然后删除引用的表。类似的东西:

INSERT INTO Table1 (key_col, attrib_col1) 
   SELECT 'new_key_value',  attrib_col1
     FROM Table1 
    WHERE key_col = 'old_key_value';

INSERT INTO Table2 (key_col, attrib_col2) 
   SELECT 'new_key_value',  attrib_col2
     FROM Table2 
    WHERE key_col = 'old_key_value';

DELETE 
  FROM Table2
 WHERE key_col = 'old_key_value';

DELETE 
  FROM Table1
 WHERE key_col = 'old_key_value';

答案 2 :(得分:0)

您应该只需要为父表插入新行并在事后更新子行...

INSERT INTO ParentTable (PKColumn, attribute1, attribute2)
    SELECT 'NewPKValue', attribute1, attribute2
    FROM   ParentTable
    WHERE  PKColumn = 'OldPKValue'
;


UPDATE ChildTable
SET    FKColumn = 'NewPKValue' 
WHERE  FKColumn = 'OldPKValue'
;


DELETE
FROM   ParentTable
WHERE  PKColumn = 'OldPKValue'
;

现在为了陷阱:

1。)如果在父表中的非PK列上定义了任何唯一索引,并且您需要使用当前记录的非PK数据值而不进行修改,则上述代码将无法工作。

2。)既然你问这个问题,我假设你的父表没有使用IDENTITY列作为PK。

3。)代码肯定不是那么有效。如果您的数据库不经常在几行上执行此操作,那么您应该没问题。如果你需要每秒80次这样做,那么我强烈建议你与程序员/ DBA或供应商联系,如果它们完全可用,关于更新FK定义以包括ON UPDATE CASCADE。

4。)确保在创建新父记录或更新子记录时,任何一个表上都没有任何触发器会导致意外的副作用。