# Zeile aus DB löschen und ID runterzählen



## Antoras (8. Jun 2009)

Hallo,

ich hab nochmal ein Problem mit meiner DB:

Ich würde gerne einzelne Zeilen aus meiner DB löschen, was auch problemlos klappt. Nur hab ich das Problem, dass, wenn die gelöschte Zeile nicht die Letzte war, nun eine leere ID existiert. Beim nächsten Anlegen einer Zeile wird die ID ganz normal hochgezählt. 
Wie mach ich das am besten, dass beim Löschen alle IDs, die größer als die gelöschte ID sind, um eins runtergezählt werden?

Ach ja: Ich verwende das DBMS H2.


----------



## DocRandom (9. Jun 2009)

Moin!

Wenn Du ne fortlaufende ID brauchst, mußt Du Dir einen ID-Pool schaffen.
Sprich eine Tabelle in der Du die zu vergebenden ID´s speicherst und im Fall einer Dupellöschung die ID dorthin rettest.

lg


----------



## Antoras (9. Jun 2009)

Aber dann hab ich ja immer noch das Problem, dass die bestehenden IDs nicht runtergezählt werden. Außerdem werden neue Einträge dann nicht am Ende der Tabelle, sondern wieder am Platz der gelöschten ID angelegt.


----------



## musiKk (9. Jun 2009)

Naja, sowas wie

```
UPDATE tabelle t SET t.id = t.id + 1 WHERE id > letzte_geloeschte_id
```
oder so. Dauert bei größeren Tabellen u. U. natürlich.
Die Frage ist nur: Wozu brauchst Du das? Eine ID identifiziert ein Tupel eindeutig, die sollte sich eigentlich nie ändern (müssen).


----------



## Antoras (9. Jun 2009)

Stimmt, wenn ich so weiter denke, dann würde es schon noch ein paar Probleme geben eine ID nachträglich zu ändern. Hab nur gedacht, dass wenn mal viele Daten gelöscht werden, ich in einer großen Tabelle sehr viele unverbrauchte IDs besitzen würde.

Nochmal zu diesem ID-Pool: Dieser würde mir bei diesem Problem Abhilfe schaffen, indem neue Einträge einfach an die Stelle von gelöschten IDs gesetzt werden, sehe ich das richtig?


----------



## musiKk (9. Jun 2009)

Das mit den unverbrauchten IDs stimmt natürlich. Aber i. d. R. hat man da einen Datentyp, der genug Werte zulässt, z. B. Ganzzahlen mit 32 oder 64 Bit. Vor allem letzteres kann man niemals erschöpfen, wenn man immer sequentiell hochzählt. Von diesem Standpunkt ist es völlig egal, wieviele Lücken es gibt. Und IDs werden meistens ja auch nur von den Systemen intern verwendet.


----------



## Antoras (10. Jun 2009)

Also würdest du (ihr) mir nicht empfehlen auf so einen ID-Pool zurückzugreifen, sondern die IDs einfach ganz normal hochzuzählen und die Lücken in Kauf zu nehmen bzw. nicht beachten?


----------



## tfa (10. Jun 2009)

Wo soll den ein Problem mit Lücken sein? Die ID bezeichnet eindeutig ein Objekt (bzw. DB-Eintrag). Mehr nicht. 
Ich gehe davon aus, diese ID ist der Primärschlüssel in der DB und hat keine weitere Bedeutung in der Anwendung.
Wenn du daran rumspielst, bekommst du sicherlich erst Probleme.


----------



## Antoras (10. Jun 2009)

Die ID ist mein PS, ja. Dieser wird aber noch in anderen Tabellen benötigt - von dem her würde es wirklich Probleme verursachen ihn zu ändern. 
Ok, ihr habt mich überzeugt. Ich lass die Lücken einfach in der DB drin.

Danke für eure Antworten.


----------

