由于FK约束,两个表相互绑定。我试图通过禁用所有触发器来更新这些表但仍然收到以下错误: -
UPDATE语句与FOREIGN KEY约束“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
答案 0 :(得分:3)
在此实例中,TRIGGER与您的外键约束无关,因此您可以完全删除所有对启用和禁用TRIGGERS的引用。
ALTER TABLE [Test] DROP CONSTRAINT [FK_TEST_REFERRING_REFPHYSI]
您的更新语句
ALTER TABLE [Test] ADD CONSTRAINT [FK_TEST_REFERRING_REFPHYSI] FOREIGN KEY([RefID])
参考文献[RefPhysician]([RefID])
答案 1 :(得分:3)
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,则效果会更好。
答案 2 :(得分:0)
如果您的更新违反参照完整性,则会被拒绝 - 禁用触发器无效。触发器与RI
无关通常使用ddl作为数据更新例程的一部分非常糟糕 - 你应该做这类事情
答案 3 :(得分:0)
触发器和键约束是不同的东西,虽然它们有时可用于创建相同的效果,但禁用一个与禁用另一个不同。
在那里放置外键约束以指示不应允许某些操作。你不应该(几乎从不)丢弃它们只是为了将数据输入到系统设计不允许的系统中
如果您尝试更改一个表中的主键是另一个表中的外键,则适当的方法是CASCADE从一个表到另一个表的更改,这可以以声明方式完成(也就是说,它会自动发生)当您更新主键时)。或者,您可以获取从属表中记录的PK值,从FK字段中取出NULL(如果架构允许),更新控制记录,然后更新
中的FK值