我得到了2张桌子。他们有一个外键关系。但是外键未设置为更新级联。现在我想更新表的主键。由于FK,SQL Server总是阻止我这样做。我怎么能在SQL命令中做到这一点?我无权修改FK。如何级联更新其外键未设置为级联的2个表?
谢谢。
我得到了2张桌子。他们有一个外键关系。但是外键未设置为更新级联。现在我想更新表的主键。由于FK,SQL Server总是阻止我这样做。我怎么能在SQL命令中做到这一点?我无权修改FK。如何级联更新其外键未设置为级联的2个表?
谢谢。
你为什么要这样做?它让我感到潜在危险。 您的SQL需要先更新相关表,然后将链接清空回PK表并存储受影响记录的ID。然后你可以更新PK表中的PK。然后返回并更新相关表中的FK。
根据现有行的属性值创建新行,但使用新的键值。对所有引用表执行相同的操作。然后,使用新的旧键值,从引用表中删除行,然后删除引用的表。喜欢的东西:
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';
您应该只需要在事后插入新行父表和更新子行...
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.)既然你问这个问题,我假设你的Parent表没有使用IDENTITY列作为PK。
3.)代码肯定比效率低。如果你的db在几行上不经常这样做,你应该没问题。如果您需要每秒执行80次这样的操作,那么我强烈建议您与程序员/ DBA或供应商联系,如果他们根本可用,请更新FK定义以包含ON UPDATE CASCADE。
4.)确保当您创建新的父记录或更新子记录时,任何表上都没有任何触发器会导致意外的副作用。
您不能 - 您需要更改FK,禁用FK并在之后重新启用它,或者不执行更新。 SQL Server中没有任何延迟约束检查选项 – 2011-02-23 09:50:28