说我有两张桌子。 Errors
和ErrorsDetails
。所以我有一个可能包含许多ErrorDetails记录的错误记录。
用户将通过他们使用的应用程序定期删除详细记录。清理(删除)所有详细记录后,我也想自动删除主记录。
如果主服务器不拥有更多详细信息,那么删除详细信息和主服务器的一个SQL删除语句将会很酷。但我似乎无法得到一个干净的SQL语句来做到这一点。每次删除后我都不想轮询主人的细节。
错误
ID Error
1 Import Error
2 Export Error
ErrorsDetails
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
感谢您的任何建议。
更新
有人提到使用触发器。我想到了,但没有提到它。触发器肯定会起作用。这种情况的触发器的优缺点是什么?
答案 0 :(得分:2)
您可以使用触发器 或
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