【发布时间】:2011-02-01 13:03:19
【问题描述】:
我有一个存储一组属性并保持它们按顺序排列的表。有可能会从表中删除其中一个属性(行),并且应该压缩位置序列。
例如,如果我最初有这些值:
+----+--------+-----+
| id | name | pos |
+----+--------+-----+
| 1 | one | 1 |
| 2 | two | 2 |
| 3 | three | 3 |
| 4 | four | 4 |
+----+--------+-----+
并且第二行被删除,所有后续行的位置都应该更新以缩小差距。结果应该是这样的:
+----+--------+-----+
| id | name | pos |
+----+--------+-----+
| 1 | one | 1 |
| 3 | three | 2 |
| 4 | four | 3 |
+----+--------+-----+
有没有办法在单个查询中进行此更新?我怎么能这样做?
PS:我很欣赏 SQLServer 和 Oracle 的示例,因为系统应该支持这两种引擎。谢谢!
更新: 这样做的原因是允许用户随意修改位置,以及添加或删除新行。位置会显示给用户,因此,这些位置应始终显示一致的序列(并且必须存储此序列,而不是按需生成)。
【问题讨论】:
-
这可能会消耗大量资源,本质上您所做的是排序,然后使用其订单号更新每一行。当您有 300 万条记录并删除第 1 行时会发生什么?必须发布 2,999,999 次更新!您想在这里实现什么 - 也许我们可以帮助您设计一些更好的东西。
-
嗯,你说得有道理。但是该表不应该包含超过几百行,因此性能不会受到太大影响(此外,此查询可能是另外一百个查询的一部分,因此性能已经搞砸了)。
-
你不会在这里获得并发。如果会话 A 删除“两个”同时会话 B 删除“三个”,您将遇到锁定问题。如果是批处理作业,那可能不是问题。
标签: sql-server oracle sequences