在事务期间禁用约束

Eri*_*ric 5 sql-server

我正在整理一个表格,用于向某些信息请求发送后续消息。向一组人发送请求并跟踪响应。如果一个人未能回应,则可能会发送零个或多个跟进。我创建了一个表:

FollowupId int primary key, 
RequestId int foreign key (outside this example), 
Follows int foreign key (FollowupId), 
Message varchar
Run Code Online (Sandbox Code Playgroud)

如果一条消息是第一条跟进消息,Follows 将为空。否则,它是其他一些 Followup 的 id。我还在 Follows 上添加了一个独特的约束。也就是说,在任何给定消息之后不能有超过一条消息。

编辑:我还应该突出显示 Follows 上的外键。它引用此表中的 FollowupId。所以如果A->B->C,仅仅删除B会使C中的外键无效。同样,不可能只更新 C 以跟随 A,因为 B 已经跟随 A 并且唯一约束禁止重复。

当然,问题是,如果该消息后面是另一个消息,则删除后续条目现在很困难。在我看来,应该可以禁用约束检查,从而可以删除中间的后续内容,“向上移动”后续后续内容,然后重新启用检查。是否有某种方法可以仅在事务期间禁用约束?

(此外,我知道在此表中包含 RequestId 可能会导致数据不一致。最好有 Followups [FollowupId, Message]、InitialFollowups [FollowupId, RequestId] 和 followingFollowups [FollowupId, Follows] 表。我认为它不必要地使这个例子复杂化。)

A-K*_*A-K 3

禁用/启用某些修改的约束通常是一个坏主意,并且性能可能会很差。每当您执行此操作时,请确保您的约束不仅已启用而且在完成后受信任。

对于您的情况,您需要删除一行并修改另一行。如果您已经使用 SQL 2008,则应该使用 MERGE,它允许您在一个命令中删除和更新。