【问题标题】:How to cascade update 2 tables whose foreign key is not set to cascade?如何级联更新2个外键未设置级联的表?
【发布时间】:2011-02-23 09:19:45
【问题描述】:

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

谢谢。

【问题讨论】:

  • 您不能 - 您需要更改 FK,禁用 FK 并在之后重新启用它,或者不执行更新。 SQL Server 中没有任何延迟约束检查选项

标签: sql sql-server


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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';
    

    【讨论】:

      【解决方案3】:

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

      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.) 如果父表的非主键列上定义了唯一索引,则上面的代码将不起作用,并且您需要使用当前记录的非主键数据值而不进行修改。

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

      3.) 代码肯定效率不高。如果您的数据库必须在几行上不频繁地执行此操作,那么您应该没问题。如果您需要每秒执行 80 次此操作,那么我强烈建议您与程序员/DBA 或供应商(如果有的话)讨论更新 FK 定义以包含 ON UPDATE CASCADE。

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

      【讨论】:

        猜你喜欢
        • 2018-08-05
        • 2014-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        相关资源
        最近更新 更多