SQL Server:更新外键引用完整性

时间:2016-05-16 13:30:41

标签: sql sql-server database

我在SQL Server数据库中有以下表格:A,B& ç

  • A有一个主键ID
  • B的主键包含IDA_IDA_ID也是A.ID的外键。
  • C有一个主键ID和一个包含A_IDB_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会有一个无效的外键。

SQL Fiddle here

我想一种方法是删除C中的外键约束,并在查询运行后重新创建它。有没有办法在不改变表格结构的情况下做到这一点?

2 个答案:

答案 0 :(得分:2)

当您希望能够更改FK引用的表的PK时,您可以如您所述删除并重新创建FK。

或者您可以使用ON UPDATE CASCADE重新创建FK。

这意味着如果FK引用的PK发生变化,那么FK也会自动更改。

编辑:如果你的意思是你可以做到这一点而根本没有丢弃或改变FK,那么正如Rich Brenner在评论中建议的那样,你可以做"更新&#34 ;在两个(四个,真正的)阶段,首先创建您想要的数据,然后删除您不再需要的数据:

  1. 向B
  2. 添加新的所需数据
  3. 向C添加新数据,在B
  4. 中引用新数据
  5. 从C
  6. 中删除不需要的数据
  7. 从B
  8. 删除不需要的数据

答案 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.