4

我正在使用 Microsoft SQL Server,并且我有一个主从场景,我需要存储详细信息的顺序。所以在 Detail 表中,我有 ID、MasterID、Position 和其他一些列。MasterID 和 Position 上还有一个唯一索引。它工作正常,除了一种情况:当我有一些现有的详细信息并更改它们的顺序时。例如,当我将位置 3 上的详细信息更改为位置 2 上的详细信息时。当我保存位置 2 上的详细信息(在数据库中的位置等于 3)时,SQL Server 会抗议,因为索引唯一性约束。

如何以合理的方式解决这个问题?

提前谢谢你
Lukasz Glaz

4

2 回答 2

2

这是一个经典问题,答案很简单:如果要将第 3 项移动到位置 2,则必须先将 2 的排序列更改为临时数字(例如 99)。所以它是这样的:

Move 2 to 99
Move 3 to 2
Move 99 to 3

但是,您必须小心,您的临时值永远不会在正常处理中使用,并且如果适用,您尊重多个线程。

更新:顺便说一句 - 处理“多个用户可能正在更改订单”问题的一种方法是做我所做的:给每个用户一个数字 ID,然后将其添加到临时号码(我的员工 ID 实际上是唯一身份用于门控登录的人员表中的字段 ID)。因此,例如,如果您的头寸永远不会为负,您可以使用 -1000 - UserID 作为您的临时值。不过相信我一件事:你不想只是假设你永远不会发生碰撞。如果您认为并且确实发生了这种情况,那么调试将非常困难!

更新:GUZ 指出他的用户可能已经重新订购了整套订单项并将它们作为一批提交——这不仅仅是两条记录的切换。那么,您可以通过以下两种方式之一来解决此问题。

首先,您可以将整个集合的现有排序字段更改为一组新的非冲突值(例如 -100 - (staffID * maxSetSize) + existingOrderVal),然后逐条记录并将每条记录更改为新的订单价值。

或者,您基本上可以将其视为数组上的冒泡排序,其中 orderVal 值等同于您的数组索引。要么这对您来说非常有意义(并且很明显),要么您应该坚持解决方案 1(无论如何这更容易)。

于 2010-04-07T14:27:02.117 回答
0

您可以只删除 order 列上的唯一约束(但保留索引键),并在必要时确保代码的唯一性。

于 2010-04-07T14:26:30.777 回答