我在SQL Server数据库中有以下表格:A,B& ç
ID
ID
和A_ID
。 A_ID
也是A.ID
的外键。 ID
和一个包含A_ID
和B_ID
我想将B和C的A_ID更新为不同的记录,例如
UPDATE B SET A_ID = 2 WHERE ID = 1
UPDATE C SET A_ID = 2 WHERE B_ID = 1
不幸的是,由于引用完整性,我将无法更新B.A_ID。如果可以的话,C会有一个无效的外键。
我想一种方法是删除C中的外键约束,并在查询运行后重新创建它。有没有办法在不改变表格结构的情况下做到这一点?
答案 0 :(得分:2)
当您希望能够更改FK引用的表的PK时,您可以如您所述删除并重新创建FK。
或者您可以使用ON UPDATE CASCADE
重新创建FK。
这意味着如果FK引用的PK发生变化,那么FK也会自动更改。
编辑:如果你的意思是你可以做到这一点而根本没有丢弃或改变FK,那么正如Rich Brenner在评论中建议的那样,你可以做"更新&#34 ;在两个(四个,真正的)阶段,首先创建您想要的数据,然后删除您不再需要的数据:
答案 1 :(得分:1)
除非我遗漏了什么,否则为什么不使用交易?
由于两个表中的A_Id
都指向Id
表中的A
列,因此我认为更新每个表中包含的2个不同更新语句中的记录没有问题单笔交易。
这样,如果其中一个更新失败,则回滚事务:
BEGIN TRY
BEGIN TRANSACTION
UPDATE b
SET a_id = 3
WHERE id = 3;
UPDATE c
SET a_id = 3
WHERE b_Id = 3;
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
END CATCH
外键约束不应成为问题 see fiddle here.