外键约束

时间:2009-10-14 14:10:01

标签: sql sql-server sql-server-2005 tsql

由于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

4 个答案:

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