2016-09-02 1 views
0

Ich habe eine Tabelle in mir H2 db, die eine gewisse geordnete Liste speichert:H2 - Aktualisiere jede Zeile mit ihrer Indexnummer (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  | 

Wenn ich Artikel entfernen 'D', ich muss C's Index auf 2 und B's Index auf 3 aktualisieren.

Und ich werde verrückt, wenn ich das triyng mache. Ich will nicht einfach

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

, weil ich fürchte, meine Tabellenspalten (verursacht durch unbekannten Gründen) enthalten kann, so suche ich nach einer etwas wie

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

aber eleganter.

Gibt es eine Möglichkeit, meine Bedürfnisse mit H2 zu erreichen?

+0

verwenden Was genau ist f_index? Ist es nur die PK des Tisches? Wenn ja, sollten Sie sich keine Gedanken darüber machen, es zu aktualisieren. – nasukkin

+0

Warum müssen Sie den f_index aktualisieren? – Guenther

+0

@nasukkin Ich habe CREATE TABLE sql – sinedsem

Antwort

1

Wenn Sie nur h2 verwenden, dann können Sie die folgende Anweisung

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

Das ist perfekt! Eine kurze Notiz, dass 'rownum()' mit '1' beginnt, und ich hatte Indizes von 0, was' Unique Index oder Primärschlüsselverletzung' verursacht, also habe ich 'merge in Items (f_id, f_index) Schlüssel (f_id) select f_id, rownum() - 1 von den Ordnen nach f_index' – sinedsem

Verwandte Themen