【问题标题】:How do I delete the master record automatically when all detail records are deleted in SQL Server 2008?SQL Server 2008 删除所有明细记录后,如何自动删除主记录?
【发布时间】:2012-10-31 12:35:57
【问题描述】:

假设我有两张桌子。 Errors 和 ErrorsDetails。所以我有一个错误记录,其中可能包含许多 ErrorDetails 记录。

用户将通过他们使用的应用程序定期删除详细记录。当所有明细记录都被清理(删除)后,我也想自动删除主记录。

如果 master 不再拥有更多详细信息,那么一个 SQL 删除语句将删除详细信息和 master 会很酷。但我似乎无法得到一个干净的 SQL 语句来做到这一点。每次删除后,我宁愿不要轮询主人以获取详细信息。

错误

ID        Error
1         Import Error
2         Export Error

错误详情

ID        ErrorsID        DetailedInfo
1         1               Couldn't import file because of FTP error
2         1               Couldn't import file because of permission error
3         2               Couldn't export file because of directory doesn't exist

我已经尝试像这样添加cascade 删除约束,但它似乎不起作用。

alter table dbo.ErrorsDetails
    add constraint FK_Delete_Master
        foreign key (ErrorsID) references dbo.Errors(ErrorsID) on delete cascade

感谢您的任何建议。

更新

有人提到使用触发器。我想过,但没有提及。触发器肯定会完成这项工作。这种情况下触发器的优缺点?

【问题讨论】:

    标签: sql-server-2008 master-detail cascading-deletes


    【解决方案1】:

    您可以使用触发器 或

    declare @ErrorsId int
    select @ErrorsId = ErrorsId from ErrorsDetails where ID = @id
    delete from ErrorsDetails where ID = @id
    
    declare @errorDetailCount int
    select @errorDetailCount = count(*) from ErrorsDetails where ErrorsId = @ErrorsId 
    
    if (@errorDetailCount = 0)
    begin
     delete from Errors where ID = @ErrorsId 
    end
    

    更新: 触发器:

    create trigger [dbo].[ErrorsDetails_Delete_Trigger] on [dbo].[ErrorsDetails] 
    instead of delete
    as 
    begin          
        declare @ErrorsId int
        select @ErrorsId = ErrorsId from deleted
        delete from ErrorsDetails where ID = deleted.ID
    
        declare @errorDetailCount int
        select @errorDetailCount = count(*) from ErrorsDetails where ErrorsId = @ErrorsId 
    
        if (@errorDetailCount = 0)
        begin
         delete from Errors where ID = @ErrorsId 
        end     
    end
    

    【讨论】:

    • 我想到了触发器。我应该在我原来的问题中提到这一点。触发器的优点/缺点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多