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

标签 java sql h2

我的 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 > ?

因为我担心我的表格可能包含间隙(由未知原因引起),所以我寻找类似的东西

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

关于java - H2 - 使用索引号更新每行(0,1,2,3,..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39301068/

相关文章:

java - 在没有 XML 配置的情况下初始化数据库,但使用 @Configuration

java - 从通过 hive 插入的 hbase 读取数据时出现问题

java - 如何在java中设置 session 属性?

java - 服务器(Python)-使用套接字的客户端(Java)通信

mysql - 获取 varchar 字段的最大记录

sql - 如何舍入 double 类型值?

sql - 基于一列对数据进行分组

java - 如何在 Spring Boot 应用程序启动时启动 H2 TCP 服务器?

Java 简单日期格式和解析,不生成唯一值?

java - Gerrit 删除需要验证 +1(已验证)