2016-09-02 25 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