2016-09-02 12 views
0

私は私の中で、いくつかの順序付けられたリストを格納H2 DB、テーブルを持っている:私は、アイテムを削除する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に更新する必要があります。

そして、これを行うには私は狂っています。私は私のテーブルには、(未知の理由によって引き起こされる)ギャップを含めることができます怖いので、私は

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); 
} 

が、よりエレガントような何かを探しているので、私は単に

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

たくありません。

H2で私のニーズを達成する方法はありますか?

+0

を使用することができH2を使用したい場合は?テーブルのPKだけですか?もしそうなら、あなたはそれを更新することについて心配するべきではありません。 – nasukkin

+0

なぜf_indexを更新する必要がありますか? – Guenther

+0

@nasukkin私はCREATE TABLE sqlを提供しました – sinedsem

答えて

1

あなただけの、あなたが次の文f_indexが正確に何である

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

これは完璧です! 'rownum()'が '1'で始まり、'ユニークなインデックスやプライマリキーの違反 'を引き起こした0からのインデックスがあるので、 'merge into items(f_id、f_index)key(f_id)select f_id、rownum() - f_index'でアイテムの順序から1つ – sinedsem

関連する問題