6

我有一个使用 SQL 表的 Java 应用程序,其中包含按顺序列排序的实体的有序列表。我想在列表中间添加/删除内容。现在,我想知道一些持久性框架/orm/you-name-it 是否可以通过批量更新订单列来提供这种功能。

在基本情况下,Hibernate(可能还有其他)提供此功能。问题是对象一次只处理一个,当列表足够大时就会出现问题。另一种解决方案是使用批量 SQL 更新来完成此操作,例如如下所示:

UPDATE table SET order_col = order_col + 1 WHERE order_col > 47
INSERT TO table VALUES ('new_id', 'new_description, ..., 47)

数据库引擎可以很快完成,但不受支持。

现在,我知道这种批量更新在考虑对象及其版本控制、脏检查等时不太适合。我仍然会问是否有人有一些好主意,或者是否有一些持久性框架/ORM/你的名字- 它会提供一些帮助。当然,我可以使用自定义 SQL/HQL/... 来做这件事,但想知道是否已经有一些解决方案(我认为其他人之前可以做过类似的事情,甚至将其置于开源之下)。也欢迎与该问题相关的其他好主意=)

4

2 回答 2

6

我的建议是做两件事:

  1. 在你的项目之间选择非常大的增量,比如一百万。这样,您可以将 8,000,000 的项目移动到 7,000,000 之前,只需将其更改为 6,500,000;和
  2. 不时地将项目重新排序为批处理作业。

大增量并不能消除进行大量重新订购的问题,但需要进行大量重新订购的可能性极小,并且批处理作业可以根据需要每天/每周/每月重新订购一次。

一次更换一大堆项目只是混乱和自找麻烦。

于 2009-01-30T12:43:48.543 回答
5

如果你真的想得到一个连续的顺序,你可以这样做:

首先,乘以sortorder1000

UPDATE testtable SET sortorder = sortorder * 1000

现在进行插入并插入合适sortorder的值以将新条目放在正确的位置。

现在使用ROW_NUMBER函数进行表更新并更新值

UPDATE testtable
SET sortorder = subq.newsortorder
FROM
  (
  SELECT
    ID as innerID,
    ROW_NUMBER() OVER(ORDER BY sortorder ASC) as newsortorder
  FROM testtable
  ) subq
WHERE subq.innerID = ID

选择 ID 是innerID因为更新后的表不能使用别名,否则 ID 列会变得不明确。

这是sortorder在按 排序时使用行号更新sortorder

于 2009-01-30T14:10:51.393 回答