sql - 更新与唯一索引冲突的多行

标签 sql sql-update unique-index

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

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

先感谢您
卢卡斯·格拉茨

最佳答案

这是一个经典问题,答案很简单:如果要将项目 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),然后逐条记录并将每条记录更改为新的订单值(value)。

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

关于sql - 更新与唯一索引冲突的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2593223/

相关文章:

php - MySQL 更新另一个表的连接信息

sql - 如何在 MSSQL 中使用聚合函数更新表中的两列?

sql - 重命名 PostgreSQL 中的多个列

mysql - 删除具有唯一索引的重复项

SQL多对多查询问题

sql - 并行插入到单个表的最快方法

sql - 存储过程,传递表名作为参数

SQL Server 跨表唯一索引

Mysql 5.7.13 innodb 唯一列 varchar(500)

python - Python 如何在没有 %s 的情况下进行字符串替换?