自引用外键约束并删除

Tim*_*ter 7 sql t-sql sql-server-2005 constraints foreign-key-relationship

在SQL-Server中处理自引用外键约束的推荐方法是什么?

表 - 型号:

在此输入图像描述

fiData引用tabData中的上一条记录.如果我删除引用的记录,则fiData数据库会引发异常:

"DELETE语句与SAME TABLE REFERENCE约束冲突"FK_tabDataPrev_tabDataNext".冲突发生在数据库"MyDataBase",表"dbo.tabData",列'fiData'"

如果Enforce Foreignkey Constraint设置为"是".

我不需要级联删除被引用的记录,但我需要设置fiData=NULL它被引用的位置.我的想法是设置Enforce Foreignkey Constraint为"No"并创建一个删除触发器.这是值得推荐还是有更好的方法?

谢谢.

Dam*_*ver 7

与Andomar不同,我很乐意使用触发器 - 但我不会删除约束检查.如果将其实现为instead of触发器,则可以在执行实际删除之前将其他行重置为null:

CREATE TRIGGER T_tabData_D
on tabData
instead of delete
as
    set nocount on
    update tabData set fiData = null where fiData in (select idData from deleted)
    delete from tabData where idData in (select idData from deleted)
Run Code Online (Sandbox Code Playgroud)

它的短,它的简洁,它不会是必要的,如果的SQL Server可以处理外键级联到同一个表(在其他RDBMS",你可以只指定ON DELETE SET NULL为外键约束,情况因人而异).

  • 谢谢。但是我在创建触发器时遇到了一个例外:“无法在具有外键且定义了DELETE / UPDATE操作的级联的表上定义INSTEAD OF DELETE / UPDATE触发器”。 (2认同)