2010-05-17 50 views
4

我正在放置一張表,用於將後續消息發送到某些信息請求。一個請求被髮送給一組人並且跟蹤響應。如果一個人沒有迴應,可能會發送零或更多的跟進信息。我創建了一個表格:在交易過程中禁用約束條件

FollowupId int primary key, 
RequestId int foreign key (outside this example), 
Follows int foreign key (FollowupId), 
Message varchar 

如果消息是第一個後續消息,則Follows將爲空。否則,這是其他一些跟進的ID。我還爲Follows添加了一個獨特的約束。也就是說,只有一條消息可以跟隨任何給定的消息。

編輯:我還應該強調關注的外鍵。它在此表中引用了FollowupId。所以如果A-> B-> C,只是刪除B使得C中的外鍵無效。同樣,僅僅更新C來跟隨A是不可能的,因爲B已經在A之後,並且唯一約束禁止重複。

問題是,當然,刪除後續條目現在很難,如果該消息跟着另一條。在我看來,應該可以禁用約束檢查,以便可以刪除中間的後續操作,「向上移動」後續跟蹤,然後重新啓用檢查。是否有某種方法可以僅在事務處理期間禁用約束? (另外,我知道在這個表中有RequestId可能會導致數據不一致,最好有Followups [FollowupId,Message],InitialFollowups [FollowupId,RequestId]和FollowingFollowups [FollowupId,Follows ]表,我認爲它不必要地使這個例子變複雜了。)

回答

3

禁用/啓用約束一些修改通常是一個壞主意,性能可能會很糟糕。每當你這樣做的時候,確保你的約束不僅被啓用,而且在你完成後被信任。

就你而言,你需要刪除一行並修改另一行。如果你已經在SQL 2008上,你應該使用MERGE,它允許你在一個命令中刪除和更新。

0

更新你的其他值,然後做你的刪除。

所以,如果訂單

甲 - >乙 - 「ç

和你刪除B,更新C'S跟隨到A,A的FollowedUp至C,然後刪除B.

1

我發現(至少在SQL Server上)禁用唯一約束是不可能的。可以禁用外鍵約束,將要刪除的記錄的id設置爲無效和不可能的id(例如,在我的情況下爲-1),更改後續id,刪除有問題的記錄,然後恢復約束檢查。假設有以下數據:

關注| RequestId |遵循|消息
1 | 17 | NULL | 「第一個」
2 | 17 | 1 | 「第二個,刪除這個」
3 | 17 | 3 | 「第三個,但將其作爲第二個」

我使用了以下策略:

//開始交易,

alter table RequestFollowups NOCHECK CONSTRAINT FK_Follows_FollowId; 
update RequestFollowups set Follows=-1 where FollowupId=2; 
update RequestFollowUps set Follows=1 where FollowupId=3; 
delete from RequestFollowups where FollowupId=2; 
alter table RequestFollowups WITH CHECK CHECK CONSTRAINT FK_Follows_FollowId; 

//提交事務