H2 - 用索引号 (0,1,2,3,..) 更新每一行

H2 - update each row with its index number (0,1,2,3,..)

我有一个 table 在我的 H2 数据库中,它存储了一些有序列表:

CREATE TABLE IF NOT EXISTS items 
(
  f_id      INTEGER NOT NULL PRIMARY KEY,
  f_name    VARCHAR(255) NOT NULL,
  f_index   INTEGER NOT NULL UNIQUE
)


|f_id|f_name|f_index|
|1   |A     |1      |
|2   |C     |3      |
|3   |B     |4      |
|4   |D     |2      |

当我删除项目 'D' 时,我需要将 C 的索引更新为 2,将 B 的索引更新为 3。

当我尝试这样做时,我快要疯了。我不想简单

UPDATE items SET f_index = f_index-1 WHERE f_index > ?

因为我担心我的 table 可能包含空白(由未知原因引起),所以我寻找类似

的内容
SqlRowSet rowSet = jdbcTemplate.queryForRowSet("SELECT f_name FROM items ORDER BY f_index");
int i = 0;
while (rowSet.next()) {
    String name = rowSet.getString("f_name");
    jdbcTemplate.update("UPDATE items SET f_index = ? WHERE f_name= ?", i++, name);   
}

但更优雅。

有什么方法可以用H2实现我的需求吗?

如果你只想使用h2那么你可以使用下面的语句

merge into items (f_id, f_index) key(f_id) select f_id, rownum()  from items order by f_index