Antwort
 
Themen-Optionen Thema durchsuchen
Alt 07.02.2005, 20:52 Nach oben    #1
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard Nächste ID?

Ääähm,

auch wenn das eigentlich keine richtige Java-Frage ist...
Kennt zufällig jemand den SQL Befehl bei HSQLDB mit dem man sich die nächste Value eines INDEX-Feldes anzeigen lassen kann?
Bin zu doof sowas in der Doku zu finden, oder gibt es so etwas gar nicht?

Schon mal besten Dank

Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.02.2005, 23:04 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

ich denke du musst die größte ID selektieren und dann diese inkrementiert als aktuelle ID eintragen.

Java Code:
  1. SELECT MAX(id) FROM tabelle

grüße ben ...
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 02:13 Nach oben    #3
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Hallo Ben.

Das habe ich bereits probiert, allerdings gibt es dann folgendes Problem:

Angenommen ich habe 5 Datensätze in der DB, dann sind die IDs 1-5 vergeben.
Jetzt lösche ich den 5. Datensatz, dann sind die IDs 1-4 vergeben.

Das Resultat deiner Abfrage wäre dann also: 4
Würde ich diese ID+1 (5) verwenden kommt es zu folgendem Problem:

Beim Anlegen des nächsten Datensatzes weiß die Tabelle unter Umständen noch, dass 5 vergeben war und vergibt automatisch 6 als neue ID.

Mein bisheriges Workaround ist sehr unsinnige Daten in die Tabelle zu schreiben, dann mit Hilfe von SELECT WHERE unsinnige Daten herauszufinden welche ID diese erhalten haben und diese dann weiterzuverwenden.
Dat funktioniert zwar, aber erscheint mir seeehr unschön

Vielen Dank.

Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 05:06 Nach oben    #4
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 242
Standard

hol dir doch die Metadaten und dann den ColumnCount.
nove ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 08:09 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Zitat:
hol dir doch die Metadaten und dann den ColumnCount.
was heißt das?

danke für weitere information.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 09:09 Nach oben    #6
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 242
Standard

Naja du holst dir erstmal einen ResultSet über alles in deinem Table oder auch nur deine ids
dann machst du:


Java Code:
  1. ResultSetMetaData rsmd = DeinResultSet.getMetaData();
  2. int i = rsmd.getColumnCount();

und schon hast du anzahl der Datensätze. uns somit kannst du auf die id schließen.
nove ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 09:46 Nach oben    #7
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

und wie deckst du dann den fall ab, der beschrieben wurde?
also wenn der letzte datensatz gelöscht wurde, dann ist die nächste ID im obigen beispiel ja 6 und nicht 5 .. wenn man einen PRIMARY KEY verwendet, oder?
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 10:46 Nach oben    #8
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 242
Standard

Dann holst du dir eben nen neuen resultset und schaust die id nach.

wo ise broblem hä.
nove ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 10:54 Nach oben    #9
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

nixxe brobläm

ja. ich habe das noch nie getestet. mir schien das nur jetzt eben irgendwie das selbe zu machen wie mein
Java Code:
  1. SELECT MAX(id) FROM tabelle

hm. eventuell bräuchten wir jetzt noch mal ein feedback von "sparrow", ob dein ansatz das ist, was er möchte

grüße ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 12:20 Nach oben    #10
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Also wenn ich nove richtig verstehe soll ich den Datensatz erst speichern und dann ein neues ResultSet holen, in dem dann die ID für den Datensatz steht, richtig?

Sage meinen Dank
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 12:25 Nach oben    #11
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 242
Standard

nö du sollst vor dem speichern nachschauen welches die letzte Id war und dann hochzählen. Aber was ich nicht ganz verstehe warum setzt du die id selber lass das doch lieber die datenbank machen durch eine unique schlüssel. Damit umschiffts du das Kaphorn der Dateninkonsistenz. Oder willst du ne BorlandDatabaseEngine nachbauen.
nove ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 12:29 Nach oben    #12
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

meine worte.
wenn du einen PRIMARY KEY oder eben UNIQUE verwendest, dann wird doch sowieso hochgezählt. die ID ist schließlich nur für die identifikation gedacht. was da im endeffekt für zahlen stehen ist ja erst mal sekundär.

@nove:
wäre meine methode mit dem SELECT MAX(id) nicht schneller? ganz abgesehen davon, dass ich meine obige aussage vertrete
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 12:36 Nach oben    #13
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 242
Standard

natürlich ist die schneller. Das was ich gezeigt habe ist die "ihaveanduglydatabasedesignandhavetosetmyfuckingin dexesmyself" Methode.
nove ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 12:41 Nach oben    #14
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

*g* .. da ist ein D zu viel .. vor "ugly"

@sparrow:
schau eventuell mal hier rein:
http://ffm.junetz.de/members/reeg/dev/DSP/node19.html
das da von PHP geredet wird sollte dich nicht stören. es geht um die theorie
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 13:23 Nach oben    #15
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Ich bin verwirrt.

Ich benutze doch einen primary key... sonst hätte ich das Problem doch nicht.
Außerdem setze ich ihn nicht selbst, ich muß nur wissen welchen Wert die Datenbank dem Datensatz zuteilt.

Der Grund:
Ich habe bisher nur in J2ME gearbeitet und einige Spiele entwickelt.
Jetzt möchte ich Java auf Desktop umsetzen.
Mein Problem: Das Prinzip von Java ist mir schon klar.. aber ich muß lernen das auf nem Großen Bildschirm umzusetzen
Alos Swing, Fenster, Componenten...

Ich habe also zum Spaß und zum Lernen eine CD-Datenbank erstellt.

1. Fenster CD eingebem
2. Fenster Tracks eingeben

Das ganze wird natürlich in 2 verschiedenen Tabellen gespeichert die per Abfrage (JOIN) z.B. zum suchen zusammengefügt werden.
Welcher Track zu welcher CD gehört wird dabei über den PRIYMARY KEY gemanagt, der in der Tabelle für die CD steht.

Also:
Tabelle alben hat ein Feld ID
Tabelle Tracks hat ein Feld alb_ID

Wenn ich jetzt ein neues Album eingebe und möchte jetzt gleich dei Tracks dafür eingeben muß ich vorher wissen welche ID (Autowert) der neue Eintrag in Alben erhällt.

Gruß
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 13:32 Nach oben    #16
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 242
Standard

ich würde sowas über einen zweiten schlüssel regeln, sowas ähnliches hab ich schon realisiert zum speichern von CNC Programmen.
nove ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.02.2005, 07:37 Nach oben    #17
Fuzzy
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von nove
Naja du holst dir erstmal einen ResultSet über alles in deinem Table oder auch nur deine ids
dann machst du:


Java Code:
  1. ResultSetMetaData rsmd = DeinResultSet.getMetaData();
  2. int i = rsmd.getColumnCount();

und schon hast du anzahl der Datensätze. uns somit kannst du auf die id schließen.
Bist Du sicher, dass Du nicht die Zahl der Spalten abholst? "ColumnCount" legt zumindest den Verdacht nahe. Die Metadaten geben Auskunft über die Struktur des Resultsets und da das Resultset seine eigene Länge gar nicht zu kennen braucht, ist ein Zeilenzähler auch nicht zu erwarten.

select MAX(id) +1 from ... funktioniert, solange kein anderer User zwischen dem select und dem nachfolgenden insert etwas in die Datenbank einträgt. Locking hilft an der Stelle übrigens überhaupt nicht .

Um einen eindeutigen Schlüssel bei der HSQLDB zu bekommen ist laut Homepage folgendes Feature eingebaut:

Identity (autoincrement) column type

Identity columns can be used to serve as automatic unique row identifier for a table. When a new row is added to the table and the identity column is not inserted (or a NULL value is inserted), then HSQLDB provides a unique, incremental value for the column. The identity column is automatically the primary key of the table. Only one identity column can be created per table. In HSQLDB, any value can be used for updating or inserting in an identity column provided it does not violate the primary key constraint.


Wenn Du also einen Wert haben willst, brauchst Du die Spalte einfach nicht auszufüllen.

Das Problem ist dann nur, wie Du an die ID wieder herankommst. Dafür gibt es wohl die Funtkion IDENTITY(), die Dir pro Cennection den letzten vergebenen Wert zurückgibt:

1.) Eintrag des Albums in die Tabelle unter weglassen der ID. Die ID wird von HSQLDB selbst vergeben.
2.) "gleichzeitiges" Abholen des letzten Wertes, der eingetragen wurde mit
"INSERT INTO Test (Id, Name) VALUES (NULL,'Test'); CALL IDENTITY();"
3.) Benutzen der ID zum Eintragen der Tracks, die die Album-ID benötigen.

http://www.coyotesong.com/hsqldb/hsqlSyntax.html
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.02.2005, 09:42 Nach oben    #18
ehli75
Gast
 
Beiträge: n/a
Standard

Also wenn ich dich richtig verstanden habe, willst du einfach einen Mechanismus, der dir fortlaufende einduetige Ids liefert ?!?!
Benutz doch einfach eine SEQUENCE. Das ist mittlerweile SQL-Standard und funktioniert somit auch auf anderen DBs (falls du mal wechseln solltest).
Wie du eine SEQUENCE mit einer HSQLDB anlegst und benutzt findest du in der Doku (Link )



Michael
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.02.2005, 22:36 Nach oben    #19
StringBuffer
Gast
 
Beiträge: n/a
Standard

Wollte ich gerade sagen. Da kommst Du um einen Sequence-Mechanismus nicht rum.

Die ID muss vom RDBMS vergeben werden, nicht von Dir - wie willst Du das dann abwickeln, wenn mehrere User gleichzeigit eine neue ID brauchen?

Für mysql kann ich Dir bei Bedarf fertigen Code liefern
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.02.2005, 05:21 Nach oben    #20
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 242
Standard

Der Code würde mich auch Interessieren.
nove ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:03 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45