【发布时间】:2012-07-03 17:14:57
【问题描述】:
具有自定义排序的 SQL Server 表具有列:ID(PK,自动递增)、OrderNumber、Col1、Col2 ..
默认情况下,插入触发器会按照建议 here 将值从 ID 复制到 OrderNumber。 使用一些可视化界面,用户可以通过增加或减少 OrderNumber 值来对记录进行排序。
但是,如何处理同时被删除的记录?
示例: 假设您添加 PK ID 的记录:1,2,3,4,5 - OrderNumber 接收相同的值。然后删除 ID=4,ID=5 的记录。下一条记录的 ID=6 并且 OrderNumber 将收到相同的值。 缺少 2 个 OrderNumber 的跨度将迫使用户将 ID=6 的记录减少 3 次以更改其订单(即按下 3 次按钮)。
或者,可以将select count(*) from table 插入OrderNumber,但是当删除一些旧行时,它允许在表中具有多个相似的值。
如果不删除记录,而只是“停用”它们,它们仍然包含在排序顺序中,只是对用户不可见。目前,需要 Java 中的解决方案,但我认为这个问题与语言无关。
在这方面有更好的方法吗?
【问题讨论】:
-
我知道这听起来可能无关紧要,但目前您的订单变更是如何实施的?您正在谈论多次而不是一次减少
OrderNumber值的必要性。但是如果你只需要减少一次,那将如何工作?当然,您还需要在不同的行中增加OrderNumber(可能是带有OrderNumber=5的行),不是吗?你是这样做的吗?如果是这样,您在在哪里这样做,是在 SQL 中还是在应用程序中?如果在 SQL 中,你能显示脚本吗? -
@AndriyM 在检查(在 java servlet 中)该行是否不是第一个或最后一个之后,我正在运行两个 SQL UPDATE 查询来切换这两个元素的 OrderNumber。所以,就目前而言,它只是 1 元素移位。我想如果我要将元素移动几个位置,我需要更新起点和终点之间的所有 OrderNumber。
标签: sql sql-server tsql sorting