# Effiziente Java-Methode zum finden eines freien PK



## Rokko_11 (5. Dez 2009)

Hi!

Wisst ihr zufällig, ob es bereits effiziente Methoden gibt, um freie IDs in einer Tabelle zu finden.

Ich möchte in der einen Tabelle etwas einfügen, dessen Primärschlüssel merken und diesen dann in einer anderen Tabelle als Fremdschlüssel verwenden. Daher rührt das Problem.

Ich hab natürlich schon ne Methode geschrieben, die das alles aber etwas Greedy-like angeht (alle Zahlen ab 1 durchgehen, und die erste Zahl, die nicht vergeben ist returnen).
Gibts da was effizientes oder bereits vorgefertigtes?

Dankeschön für eure IDeen!


----------



## Ebenius (5. Dez 2009)

Normaler Weise überlässt man dieses Problem der Datenbank. Bei Oracle legt man eine Sequenz an und erzeugt *alle* neuen künstlichen Primärschlüssel einer Tabelle aus dieser Sequenz, bei anderen Datenbanken gibt's auch meist (eigentlich immer) ein Konzept, autonumbers zu realisieren. Natürlich verschwendet man dann Schlüssel; ein einmal vergebener Schlüssel wird nie neu vergeben, auch nicht wenn der Eintrag gelöscht wird. Aber das interessiert normaler Weise nicht und hat eher positive als negative Effekte.

Ebenius


----------



## SegFault (5. Dez 2009)

Ich stimme hier Ebenius zu. Allgemein würde ich das die DB Handeln lassen. Wenns aber wirklich wichtig ist, dort Keys neu zu vergeben, kannst du doch die keys von gelöschten Datensätzen in einer Tabelle zwischenspeichern und den ersten eintrag von dort als Key verwenden (Sofern ein Eintrag existiert). Obwohl ich das ganze für recht Fehleranfällig halte.


----------



## tfa (5. Dez 2009)

SegFault hat gesagt.:


> Wenns aber wirklich wichtig ist, dort Keys neu zu vergeben, kannst du doch die keys von gelöschten Datensätzen in einer Tabelle zwischenspeichern und den ersten eintrag von dort als Key verwenden (Sofern ein Eintrag existiert). Obwohl ich das ganze für recht Fehleranfällig halte.



Deswegen würde ich das auch nicht empfehlen. Einige Verfahren zur Generierung von Primärschlusseln findest du hier.
Wenn man nicht die DB zum Vergeben der PKs verwenden kann (warum auch immer), könnte das High/Low-Verfahren eine Lösung sein.


----------



## Rokko_11 (5. Dez 2009)

Danke für die vielen raschen Antworten! 
Ach ja... meine DB, die ich verwende, ist MySQL-Datenbank.

Wenn ich meinen Primärschlüssel aber als autoincrement wähle, weiß ich ja nach meiner insert-eingabe nicht, wie der schlüssel lautete. Wie mache ich das?
Prinzipiell ist es mir egal, ob freie Schlüssel nicht mehr verwendet werden...


----------



## SegFault (5. Dez 2009)

Wie erstellst du den Datensatz? Mit JDBC? dort gibs die getGeneratedKeys Methode MySQL :: MySQL 5.1 Referenzhandbuch :: 25.3.5.1 Grundkonzepte von JDBC (Abschnitt nach ca 2/3)


----------



## Gast2 (5. Dez 2009)

Moin,

da werden sie geholfen ... http://www.java-forum.org/plauderecke/22639-java-quiz-50.html#post490035


----------



## musiKk (5. Dez 2009)

Rokko_11 hat gesagt.:


> Wenn ich meinen Primärschlüssel aber als autoincrement wähle, weiß ich ja nach meiner insert-eingabe nicht, wie der schlüssel lautete. Wie mache ich das?



Wenn der Treiber das unterstützt (Doku), dann könnte es über Statement#getGeneratedKeys() gehen.


----------

