![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
Äää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 |
| | |
| | Nach oben #3 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
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 Dat funktioniert zwar, aber erscheint mir seeehr unschön Vielen Dank. Sparrow |
| | |
| | Nach oben #6 |
| Erfahrener Benutzer Registriert seit: 16.11.2005
Beiträge: 242
|
Naja du holst dir erstmal einen ResultSet über alles in deinem Table oder auch nur deine ids dann machst du: Java Code:
und schon hast du anzahl der Datensätze. uns somit kannst du auf die id schließen. |
| | |
| | Nach oben #7 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.512
|
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? |
| | |
| | Nach oben #9 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.512
|
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:
hm. eventuell bräuchten wir jetzt noch mal ein feedback von "sparrow", ob dein ansatz das ist, was er möchte grüße ben. |
| | |
| | Nach oben #11 |
| Erfahrener Benutzer Registriert seit: 16.11.2005
Beiträge: 242
|
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. |
| | |
| | Nach oben #12 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.512
|
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 |
| | |
| | Nach oben #14 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.512
|
*g* .. da ist ein D zu viel .. vor "ugly" @sparrow: schau eventuell mal hier rein: das da von PHP geredet wird sollte dich nicht stören. es geht um die theorie |
| | |
| | Nach oben #15 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
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 |
| | |
| | Nach oben #17 | |
| Gast
Beiträge: n/a
| Zitat:
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 | |
|
| | Nach oben #18 |
| Gast
Beiträge: n/a
|
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 |
|
| | Nach oben #19 |
| Gast
Beiträge: n/a
|
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 |
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |