我使用的是Microsoft SQL Server和我有我需要存储的细节的顺序主详细情况。因此,在详细表我有ID,MasterID,位置等一些列。也有对MasterID和位置的唯一指标。它的工作原理确定,除了一种情况:当我有一些现有的细节,我改变它们的顺序。例如,当我在位置2更改位置3a详细的细节当我保存在位置2(其中在数据库中的位置具有等于3)的SQL Server抗议细节,因为索引唯一性约束。

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

感谢您提前结果 卢卡斯Glaz

有帮助吗?

解决方案

这是一个典型的问题和答案很简单:如果要移动项目3到位置2,首先必须的2排序列改变到一个临时号码(例如99)。因此,它是这样的:

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

您一定要小心,虽然,您的临时值永远不会在正常的处理中,你尊重多线程(如果适用)。

更新:BTW - 应对单向“多个用户可以更改订单”的问题是做什么我做:给每个用户一个数字的ID,然后添加这个到临时数(我的员工ID实际上是用于门登录的人员表中的唯一标识字段ID)。因此,举例来说,如果你的位置永远是负面的,你可以使用-1000 - 用户名作为您的临时值。相信我有一两件事:你做的的希望只是假设,你永远不会有冲突。如果你认为,一个的的发生,这将是非常难以调试!

更新:GUZ指出,他的用户可能已经重新排序整套行项目的,并提交它们作为一个批次 - 它不只是一个两个记录开关。您可以通过以下两种方式之一来解决这个话。

首先,你可以改变整个集的现有排序字段一套新的不冲突的值(例如-100 - (* STAFFID MAXSETSIZE)+ existingOrderVal),然后再记录的记录,并改变每个记录到新的顺序值。

或者你基本上可以把它像一个阵列上的冒泡排序,其中orderVal值是等价的数组索引。无论这是绝对意义上你(是显而易见的),或者你应该用溶液1(这在任何情况下更容易)坚持下去。

其他提示

你可以只取出唯一约束(但留下的索引键)的顺序列,并在必要时确保其唯一性在你的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top