2016-09-02 23 views
0

我有一个表在我H2数据库,其中存储了一些有序列表更新的每一行:H2其索引号(0,1,2,3 ......)

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.

而且,如果triyng要这样做,我会很疯狂。我不想简单地

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来达到我的需求吗?

+0

什么是F_索引到底是什么?它只是桌子的PK吗?如果是这样,你不应该担心更新它。 – nasukkin

+0

为什么你需要更新f_index? – Guenther

+0

@nasukkin我提供了CREATE TABLE sql – sinedsem

回答

1

如果你只是想使用H 2,然后你可以用下面的语句

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

这是完美的!一个简单的说明,'rownum()'以'1'开始,我有索引从0,这导致'唯一索引或主键违反',所以我用'合并到项目(f_id,f_index)键(f_id)select f_id,rownum() - 1从f_index'的项目顺序 – sinedsem