Freie ID in Tabelle ermitteln

Status
Nicht offen für weitere Antworten.

foobar

Top Contributor
Hi,

wie kann man am einfachsten in einer Tabelle eine nicht verwendete ID ermitteln? Das ganze dient dazu dem Benutzer die Möglichkeit zu geben, die verwendete ID selbst zu bestimmen z.b. eine neue ID > 500.

Bisher habe ich nur sowas zu Stande gebracht:

Code:
select a.kdnr+1 
from rechkd a
where a.kdnr+1 not in (select b.kdnr
                       from rechkd b
                       where a.kdnr+1 = b.kdnr)
order by 1

Das funktioniert zwar ist aber nicht besonders performant. Geht das nicht einfacher?

Viele Grüße,
foobar
 
S

SlaterB

Gast
reicht nicht schon
where a.kdnr+1 not in (select b.kdnr from rechkd b )
?
dann muss die Subquery nur einmal berechnet werden,

aber kann wieder langsam sein, wenn die DB das 'in' nicht gut prüft und die Liste lang ist,

-------------
dann noch ein Left Join mit sich selbst und der Bedingung kndr+1?
wenn null, dann Wert nicht vorhanden
 

foobar

Top Contributor
Stimmt die Wehreklausel ist obsolet:

Code:
select min(a.kdnr+1)
from rechkd a
where a.kdnr+1 not in (select b.kdnr
                       from rechkd b)
and a.kdnr+1 > 100                       
order by 1

Das liefert mir die kleinste freie ID größer als 100.

Danke SlaterB :)
 
M

maki

Gast
Das hängt ganz stark von der DB ab, zuverlässig weiss ich dass es mit Oracle möglich ist.

Bei den hier vorgestellten Lösungen sollte man tunlichst darauf achten dass nicht ein anderer Thread zwischen der Abfrage und dem anlegen noch einen Datensatz ablegt.
 

foobar

Top Contributor
Ja, das Verfahren ist nicht ganz unproblematisch. Man muß eben einfach vor dem eigentlichen Insert nochmals prüfen, ob die Id noch vorhanden ist, weil zwischen dem Berechnen der ID und dem eigentlichen Anlegen des Datensatzes jede Menge Zeit verstreichen kann.
Mit einem Left-Selfjoin habe ich das Problem bisher nicht lösen können. Ist es eigentlich Möglich jede Subselectquery auch mit einem Join abzubilden? Gibt es dazu eine Regel? Ich habe das mal so gelernt, aber eine Regel, die das beweist, ist mir nicht bekannt.
 

Sergeant_Pepper

Bekanntes Mitglied
Hallo,

bei Oracle fallen mir zwei Möglichkeiten ein:

1. eine Sequenz
oder
2. select max(id)+1 as neuer_index from tabelle

Bei der max-Abfrage gibt es aber wieder das Problem konkurrierender Zugriffe.
Die Sequenz hingegegen ist sicher.
 

foobar

Top Contributor
max(id)+1 liefert aber nicht das gewünschte Ergebnis. Der benutzer kann sich aussuchen, ob er eine freie, möglichste kleine Id oder max(id(+1) oder eine Id seiner Wahl verwenden möchte.

Sequenzen gibt es bei Informix leider nicht :-(
 
S

SlaterB

Gast
Sequenzen würden auch nicht helfen, Lücken in der Id-Liste zu finden,
sondern liefern nur immer quasi max(id)+1 auf performant einfache Weise,
ohne gelöschte rauszurechnen, ein einfacher Zähler,

wenn man parallel manuell Ids vergibt, dann kann auch eine Sequenz-Id zu einem Fehler führen
 

Sergeant_Pepper

Bekanntes Mitglied
SlaterB hat gesagt.:
Sequenzen würden auch nicht helfen, Lücken in der Id-Liste zu finden,
sondern liefern nur immer quasi max(id)+1 auf performant einfache Weise,
ohne gelöschte rauszurechnen, ein einfacher Zähler,
Wenn die ID ausschließlich DB-intern Bedeutung hat, sind Lücken nicht schlimm.

wenn man parallel manuell Ids vergibt, dann kann auch eine Sequenz-Id zu einem Fehler führen
Klar, das ist "tödlich". Man muss als Entwickler auf jeden Fall entscheiden, ob man einen Einfluss des Endanwenders auf die ID-Vergabe zulässt oder nicht. Wenn ersteres der Fall ist, sind mehr oder wenige aufwändige Prüfungen inkl. GUI-Feedback zu realisieren.

Wenn man programmintern konsequent mit Sequenzen (Oracle) oder Auto-Increments arbeitet, hat man keine Probleme, die durch parallele Sessions entstehen können.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M HSQLDB Automatisch nächste freie Nummer ausgeben Datenbankprogrammierung 4
D Ich möchte dass ich nachdem man den Kommentar geschrieben hat den Kommentar in den Tabelle Bestellübersicht geschbeichert wird klappt nicht bei mir Datenbankprogrammierung 2
D Tabelle an Persistenzeinheit binden Datenbankprogrammierung 1
T Datenbank: Tabelle erstellen bei Web-Applikation Datenbankprogrammierung 4
S gesamte Tabelle löschen Datenbankprogrammierung 2
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
Kirby.exe Eine Tabelle updaten Datenbankprogrammierung 16
L SQL Tabelle Datenbankprogrammierung 11
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
L SQL Datenbank Tabelle erstellen Datenbankprogrammierung 6
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
J Oracle Datenbank-Tabelle per Combobox (oder ähnliches) auswählen Datenbankprogrammierung 3
P Derby/JavaDB Datenbanktabelle erweitern, ohne Tabelle zu ändern Datenbankprogrammierung 6
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
S FilterSearch Tabelle Datenbankprogrammierung 4
J Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen? Datenbankprogrammierung 39
Dimax MySQL 10 höchsten Werte aus einer Tabelle ermitteln Datenbankprogrammierung 30
L Java- Zähle alle Werte aus der Tabelle von aktiver Zelle Datenbankprogrammierung 12
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
Thallius MySQL Tabelle splitten aber wie eine abfragen? Datenbankprogrammierung 10
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
N Dynamische Tabelle Datenbankprogrammierung 84
T Zeitraum aus SQL-Tabelle Datenbankprogrammierung 3
V SQLite 2 Tabelle vergleichen und alle unterschiede rausgeben Datenbankprogrammierung 1
D UCanAccess / MS Access - Tabelle / Spalte vorhanden Datenbankprogrammierung 3
M MySQL wie Listen oder arras in Tabelle(n) schreiben Datenbankprogrammierung 10
Paul15 Tabelle vergleichen Datenbankprogrammierung 15
J Tabelle synchronisieren mit Datenbank Datenbankprogrammierung 7
E Wie kann man bestimmte Zeilen der Tabelle rot markieren? Datenbankprogrammierung 1
L Tabelle mit Inhalt füllen Datenbankprogrammierung 2
J Optimierung von Querys/ ausgegebene Tabelle mit in neue Anfrage einbinden Datenbankprogrammierung 2
M Derby/JavaDB Kleine DB mit Tabelle erweitern - Integrität - Alter-Table - Netbeans ... Datenbankprogrammierung 5
C Tabelle erstellen mit Apache JDBC-Util Datenbankprogrammierung 1
A MySQL Tabelle ID abfragen und Spalte ausgeben Datenbankprogrammierung 4
S Update Tabelle aus Textfeld Datenbankprogrammierung 2
A MySQL Problem bei Tabelle ausgeben Datenbankprogrammierung 3
E Nur der letzte Datensatz wird in Tabelle geschrieben Datenbankprogrammierung 4
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
Joew0815 Datenmerge große Tabelle Datenbankprogrammierung 16
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
P Neue Tabelle dazugekommen Datenbankprogrammierung 1
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
J Normalisierung - Aufspaltung der Tabelle Datenbankprogrammierung 4
V HSQLDB Insert in eine Tabelle mit Autoincrement Datenbankprogrammierung 2
S Wie muss meine SQL Tabelle aufgebaut sein, um unendliche Attribute zu vermeiden Datenbankprogrammierung 2
R HSQLDB Tabelle in JTable übertragen Datenbankprogrammierung 3
S MySQL Einfügen in Tabelle nur von Programm zulassen Datenbankprogrammierung 7
S Oracle Database 11g , eclipse , Tabelle erstellen Datenbankprogrammierung 2
L MySQL Uhrzeit-Format innerhalb einer Tabelle Datenbankprogrammierung 8
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
M Designfrage zu Rows die sich auf einen Datensatz derselben Tabelle beziehen Datenbankprogrammierung 7
N Temporäre tabelle MySQL Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
D DB Tabelle in JTable anzeigen - Probleme Datenbankprogrammierung 8
Rudolf MySQL MySQL Tabelle mit Fremdschlüsseln in JTable darstellen Datenbankprogrammierung 5
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D JPA (Hibernate) : Tabelle zweimal joinen Datenbankprogrammierung 4
G Oracle Hibernate M:N-Beziehung mit nur einer vorhandenen Tabelle Datenbankprogrammierung 5
N [XLS]Strings in Excel-Tabelle schreiben (poi) Datenbankprogrammierung 2
M DB View in Tabelle konvertieren in DB2? Datenbankprogrammierung 2
N Einzelne Spalte in MySQL-DB-Tabelle schreiben Datenbankprogrammierung 7
D Probleme bei der Erzeugung einer Tabelle Datenbankprogrammierung 15
I Derby/JavaDB Problem mit Befüllung von Tabelle Datenbankprogrammierung 7
H MySQL Tabelle "Table" programmieren Datenbankprogrammierung 2
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
I Tabelle mit "|" getrennten Werten -> einzelnen Wert davon abfragen Datenbankprogrammierung 15
L Derby/JavaDB Fehler beim Erstellen einer Tabelle Datenbankprogrammierung 2
A Wie Tabelle auf bestimmten Inhalt überprüfen? Datenbankprogrammierung 7
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
Y Tabelle (elegant) importieren Datenbankprogrammierung 4
turmaline [Hibernate] @OneToMany - Eine referenzierte Tabelle abfragen Datenbankprogrammierung 11
T Update an SQL Tabelle ?! Datenbankprogrammierung 10
F Baumstruktur erstellen und Art Tabelle festhalten!? Datenbankprogrammierung 13
S JPA: Objekt in Tabelle mit Composite Keys mappen (Embeddable Annotation) Datenbankprogrammierung 2
A Tabelle aktuell halten Datenbankprogrammierung 5
trash SQL, ganze Tabelle abfragen Datenbankprogrammierung 3
F HSQLDB HSQLDB lässt mich nicht auf erstellte Tabelle zugreifen Datenbankprogrammierung 12
Airwolf89 Spaltennamen einer Tabelle zurückgeben lassen Datenbankprogrammierung 9
J Ausgewählte Datensätze in DB-Tabelle schreiben Datenbankprogrammierung 13
J zufällige Auswahl aus einer Tabelle Datenbankprogrammierung 4
O eine Tabelle hat mehrere PrimKey mit dem selben Wert Datenbankprogrammierung 9
M Ausgabe in Tabelle der MySQL-Datenbank mit Java Datenbankprogrammierung 4
J Tabelle auslesen- knifflig Datenbankprogrammierung 7
Z [ORACLE] Ausgabe Tabelle im GUI Datenbankprogrammierung 4
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
R Tabelle Updaten aber auch Speichern Datenbankprogrammierung 2
D MySql Tabelle mit MySQLAdministrator (Anfänger) Datenbankprogrammierung 5
M Spaltennamen einer MS Access Tabelle ermitteln Datenbankprogrammierung 3
B Suche Query um genau einen Wert einer def. Gruppe aus einer Tabelle zu erhalten. Datenbankprogrammierung 2
C Prüfen, ob eine MySQL-Tabelle bereits existiert Datenbankprogrammierung 7
M Tabelle in Access Datei mit JDBC generieren Datenbankprogrammierung 3
G Tabelle für Zeitraum sperren Datenbankprogrammierung 4
G DB Modellierung mit variablen Attributen in der Tabelle Datenbankprogrammierung 4
S Datenbank-Tabelle in SWING/AWT ausgeben Datenbankprogrammierung 28
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
B Doppelte Zeilen einer Doppelten Spalte aus einer Tabelle entfernen. Datenbankprogrammierung 2

Ähnliche Java Themen


Oben