我正在使用Microsoft SQL Server,我有一个主 - 详细信息场景,我需要存储详细信息的顺序。所以在Detail表中我有ID,MasterID,Position和其他一些列。 MasterID和Position上还有一个唯一的索引。它可以正常工作,除了一个案例:当我有一些现有的细节,我改变他们的顺序。例如,当我用位置2上的详细信息更改位置3上的详细信息时。当我将详细信息保存在位置2(数据库中的位置等于3)SQL Server抗议时,因为索引唯一性约束。
如何以合理的方式解决这个问题?
提前谢谢你 Lukasz Glaz
答案 0 :(得分:1)
这是一个经典问题,答案很简单:如果要将第3项移动到第2位,必须先将2的排序列更改为临时数(例如99)。所以它是这样的:
Move 2 to 99
Move 3 to 2
Move 99 to 3
但是,您必须小心,您的临时值从未在正常处理中使用,并且您尊重多个线程(如果适用)。
更新:BTW - 处理“多个用户可能正在更改订单”问题的一种方法是做我做的事情:给每个用户一个数字ID,然后将其添加到临时number(我的员工ID实际上是用于登录登录的staff表中的唯一标识字段ID)。因此,例如,如果您的头寸永远不会为负数,您可以使用-1000 - UserID作为临时值。相信我的一件事:你做不想要假设你永远不会发生碰撞。如果您认为发生了 ,那么调试将非常困难!
更新:GUZ指出他的用户可能已重新排序了整套订单项并将其作为批处理提交 - 这不仅仅是两个记录的切换。您可以通过以下两种方式之一来解决这个问题。
首先,您可以将整个集合的现有排序字段更改为一组新的非碰撞值(例如-100 - (staffID * maxSetSize)+ existingOrderVal),然后逐个记录并更改每个记录到新的订单价值。
或者你可以将它视为数组上的冒泡排序,其中orderVal值等于数组索引。这对你来说是完全合理的(而且很明显),或者你应该坚持使用解决方案1(在任何情况下都更容易)。
答案 1 :(得分:0)
您可以在订单列上删除唯一约束(但保留索引键),并在必要时确保代码的唯一性。