外键约束(Foreign Key constraint)

2019-07-28 14:02发布

两个表都系彼此,因为FK约束。 我试图通过禁用所有触发,但仍发现了以下错误来更新这些表: -

UPDATE语句冲突与外键约束“FK_TEST_REFERRING_REFPHYSI”。 发生于数据库“CCDB”的冲突表“dbo.RefPhysician”,列“REFID”。 该语句已终止。”

这就是我如何我试图帮凶我的任务。 请帮助或更新下面的T-SQL: -

Begin Transaction 
Begin Try 
ALTER TABLE Test DISABLE Trigger ALL
ALTER TABLE RefPhysician DISABLE Trigger ALL
UPDATE Test 
SET RefID = '05f6c6b4-63ff-45b2-a5e2-920d5dce3e45' 
WHERE RefID = '05e6c6b4-63ff-45b2-a5e2-920d5dce3e45'; 
UPDATE RefPhysician 
SET RefID = '05f6c6b4-63ff-45b2-a5e2-920d5dce3e45' ,
SpecID = NULL ,
RefLastName = '117002 DR. BRAD DIBBLE' ,
RefFirstName = '201-190 CUNDLES RD E, BARRIE ONT L4M 4S5' ,
RefMiddleName = NULL ,
RefPhone1 = '6138365083' ,
RefPhone2 = 'print,read,866,1' ,
RefFax = '6476476464' ,
RefEmail = 'Dibble@hotmail.ca' 
WHERE 
RefID = '05e6c6b4-63ff-45b2-a5e2-920d5dce3e45'  
ALTER TABLE Test ENABLE Trigger ALL
ALTER TABLE RefPhysician ENABLE Trigger ALL
Commit Transaction 
End Try 
Begin Catch 
Rollback Transaction 
End Catch

Answer 1:

ALTER TABLE Test NOCHECK CONSTRAINT ALL
ALTER TABLE RefPhysician NOCHECK CONSTRAINT ALL

ALTER TABLE Test WITH CHECK CHECK CONSTRAINT ALL
ALTER TABLE RefPhysician WITH CHECK CHECK CONSTRAINT ALL

重要提示:有趣的“WITH CHECK CHECK”语法中的最后两行是为了保证之后SQL Server您重新启用信任FK约束。 你真的不希望重新启用它们为不可信!

但是,如果你有在桌子上设计任何影响,我强烈建议可变值不在主键和外键使用。 FK约束,如果它们是基于内部的ID插入后不会改变运行得更好。



Answer 2:

触发器是没有什么用在这种情况下你的外键约束,这样做可以彻底删除启用和禁用触发器的所有引用。

ALTER TABLE [Test] DROP CONSTRAINT [FK_TEST_REFERRING_REFPHYSI]

您的UPDATE语句

ALTER TABLE [Test] ADD CONSTRAINT [FK_TEST_REFERRING_REFPHYSI] FOREIGN KEY([RefID])

参考文献:[RefPhysician]([REFID])



Answer 3:

如果您的更新违反参照完整性将被拒绝 - 禁用触发器没有帮助。 触发器无关与RI

在使用DDL一般的数据更新工作的一部分是非常糟糕的 - 你应该做这种事



Answer 4:

触发器和键约束是不同的东西,虽然他们有时被用来产生相同的效果,禁用一个是不一样禁用其它。

外键约束是摆在那里以表示自己的某些行为不应该被允许。 你永远不应该(几乎没有),把它们仅仅是为了获取数据到未通过系统设计使系统

如果你试图改变一个表是在另一个外键的主键,适当的做法是级联从一个表到另一个变化,这可以声明来完成(即,它会在更新自动发生主键)。 或者,您可以获取记录的相关表中的PK值,空出来的FK字段(如果允许的模式),更新控制记录,然后更新中的FK值



文章来源: Foreign Key constraint