【问题标题】:Foreign Key constraint外键约束
【发布时间】:2009-10-14 22:23:45
【问题描述】:

由于 FK 约束,两个表相互绑定。我正在尝试通过禁用 ALL Trigger 来更新这些表,但仍然出现以下错误:-

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

【问题讨论】:

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


    【解决方案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,则它们的效果会更好。

    【讨论】:

    • 但是现在我收到另一个错误消息:-“子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或当子查询用作表达式。”声明已终止。
    • 您在问题中提供的 SQL 代码中没有任何子查询。这个错误发生在哪里?
    • 没有子查询。我在同一个 SQL 代码中收到此错误。我在此链接stackoverflow.com/questions/1566813/… 上发布了另一个关于此的问题。
    • 也许您的代码导致错误的表之一上有更新触发器?尝试将 DISABLE TRIGGER / ENABLE TRIGGER 语句以及约束语句放回原处。如果这样可以解决问题,您应该检查您的触发代码是否存在错误。
    • 嘿,谢谢。禁用/启用触发器工作。但我真的不明白你所说的“......你应该检查你的触发代码是否有错误”/
    【解决方案2】:

    在这种情况下,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])

    【讨论】:

    • 这无济于事。永远更改主键是个坏主意。特别是如果它在其他地方用作外键。通常需要进行此类修改表明数据库设计不佳
    【解决方案3】:

    如果您的更新违反了参照完整性,它将被拒绝 - 禁用触发器无济于事。触发器与 RI 无关

    一般来说,使用 ddl 作为数据更新例程的一部分真的很糟糕——你应该做这种事情

    【讨论】:

      【解决方案4】:

      触发器和键约束是不同的东西,虽然它们有时可以用来创建相同的效果,但禁用一个与禁用另一个不同。

      在那里放置了一个外键约束以指示不应允许某些操作。您永远不应该(几乎永远不)仅仅为了将系统设计不允许的数据输入系统而丢弃它们

      如果您尝试将一个表中的主键更改为另一个表中的外键,则适当的方法是 CASCADE 从一个表到另一个表的更改,这可以通过声明方式完成(也就是说,它会自动发生当您更新主键时)。或者,您可以获取依赖表中记录的 PK 值,将 FK 字段设为 NULL(如果架构允许),更新控制记录,然后更新

      中的 FK 值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-17
        • 2017-04-20
        • 2018-03-05
        • 2013-01-30
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多