Abfrage von Autoincrementwerten

Status
Nicht offen für weitere Antworten.

DTR

Bekanntes Mitglied
Hallo,

ich möchte in eine PostgreSQL Datenbank einen neuen Datensatz einfügen. Dabei soll mir die Datenbank als Primärschlüssel einen Autoincrementwert erzeugen. In meiner Anwendung brauch ich nun diesen Primärschlüssel. Gibt es eine Möglichkeit diesen nach dem Insert nocheinmal abzufragen, ohne eine extra Abfrage gegen die Datenbank auszuführen? Ich habe es bereits mit der Methode getGeneratedKeys() von Statement ausprobiert, diese wird von dem Treiber aber noch nicht unterstüzt. Zur zeit benutze ich den Treiber: postgresql-8.2dev-501.jdbc3.jar.

Gruß
DTR
 

bronks

Top Contributor
Wenigstens Mysql bietet eine extra Anweisung, um den letzten in der aktuellen Sitzung erstellten Key zu erhalten, aber diese Anweisung mußt Du auch erst mal an den Server schicken.

Eigentlich sollte man einen Autoincrement nur als RowId verwenden und alle anderen Schlüssel selbst erzeugen. In Businessystemen wird das zwangsweise so gemacht, weil man für eine Belegart mehrere Nummernkreise verwalten muß.

Infos zur vorgehensweise findest Du u.a. in Google wenn Du nach folgendem suchst: "ejb nextid" . Auch ohne EJB ist die vorgehensweise die gleiche ...
 

Leroy42

Top Contributor
bronks hat gesagt.:
Wenigstens Mysql bietet eine extra Anweisung, um den letzten in der aktuellen Sitzung erstellten Key zu erhalten

Genau das habe ich auch schonmal gelesen und suche verzweifelt danach, googlen (wonach genau :shock: )
hat leider nichts gebracht und ich behelfe mich derzeit mit erneutem Auslesen des letzten
Datensatzes und der hoffnung, daß sich in der Zwischenzeit niemand dazwischengedrängt
hat und mir dadurch ein falscher ID geliefert wird.

Wie heißt die Anweisung?
 

DTR

Bekanntes Mitglied
Hallo,
leider brauche ich in der Tabelle als Primärschlüssel den Auto Wert, da aus den Spalten kein Schlüssel ableitbar ist. Und den Primäschlüssel brauche ich wiederum in der Anwendung als Verweis. Die Verwaltung dieser Autowerte würde ich auch gerne der Datenbank überlassen. Das Problem das ich mit der zweiten Abfrage habe ist, das in der Zwichenzeit ein zweiter User einen Datensatz eingefügt haben könnte und ich würde auch sehr ungerne die Tabelle Sperren, nur damit ich die Zweite Abfrage absetzen kann.

Gruß
Daniel
 

Reinski

Mitglied
Hi Leute,

ich habe genau das selbe Problem, mit exakt den selben Bedenken hinsichtlich der last()-Methode und einer möglichen Gleichzeitigkeit von Inserts.
Bin ein frischer Umsteiger auf Java und eigentlich dachte ich, das wäre ein Allerwelts-Problem und super einfach zu lösen (ich meine, wieso geht das in anderen Sprachen ohne Probleme?).

Ehrlich gesagt, kann ich nicht glauben, dass es dafür in Java keine wasserdichte Lösung geben soll, außer den Auto-Wert per DB-spezifischem SQL festzustellen. Deshalb wollte ich diesen Thread nochmal bisschen pushen. :)

Hat vielleicht doch noch jemand eine Idee?

Kann man ein ResultSet evtl. so einstellen, dass es ausschließlich eigene Inserts sieht, aber keine Inserts von anderen? Dann würde die Sache auch mit move() sicher funktionieren.
Für Hilfe wäre ich sehr dankbar.
Gruß!

reinski
 

bronks

Top Contributor
Reinski hat gesagt.:
...wieso geht das in anderen Sprachen ohne Probleme? ...
Welche Sprachen und welche Probleme?

Was soll Dein Autowert darstellen und was willst Du mit diesem machen?

Autowerte werden dauernd für irgendwelche Zwecke mißbraucht, für welche sie nicht gedacht sind und dann wundern sich die Leute, daß es unerwartete Probleme gibt.
 

Reinski

Mitglied
bronks hat gesagt.:
Welche Sprachen und welche Probleme?
Öhhm, das Problem, über das hier diskutiert wird lautet:
Wenn ich eine Tabelle mit einer AutoInkrement-Spalte (=Autowert) habe und per
Code:
ResultSet.moveToInsertRow();
ResultSet.updateXxx(...);
...
ResultSet.InsertRow();
einen Datensatz einfüge, wie kann ich dann den generierten Autowert für diese Zeile mit 100%-iger Sicherheit auslesen.

Welche Sprachen? Ok, Du hast Recht, das ist eigentlich keine Funktionalität der Programmiersprche an sich, aber das ging schon mit dem oft verlachten VB6 und seinen RecordSet-Objekten. Da hatte man nach dem Insert direkt den Autowert im entsprechenden RecordSet-Feld und konnte ihn von dort auslesen. Meines Wissens ging das für alle Datenbanken...

bronks hat gesagt.:
Was soll Dein Autowert darstellen und was willst Du mit diesem machen?
Die Autowert-Spalte ist der Primärschlüssel der Tabelle (die ID der Datensätze) über den Beziehungen hergestellt werden. Ich generiere die IDs nicht selbst, da ich gerne der Datenbank die Arbeit überlassen möchte, die sie am besten kann, nämlich die Generierung eines für diese Tabelle eindeutigen Wertes.

bronks hat gesagt.:
Autowerte werden dauernd für irgendwelche Zwecke mißbraucht, für welche sie nicht gedacht sind und dann wundern sich die Leute, daß es unerwartete Probleme gibt.
Darf ich mal zurück fragen, was Du sonst mit Autowerten machst?
Falls meine Verwendung einen Missbrauch darstellt - inzwischen nimmt man ja lieber GUIDs statt fortlaufende Nummern - wie muss ich da ansetzen? Gibt es da z.B. DB-unabhängige Methoden von JDBC-Objekten?

Gruß!

reinski
 

Reinski

Mitglied
Leroy42 hat gesagt.:
:shock: Was soll denn das für eine Datenbank sein :shock:
Verstehe deine Verwunderung nicht ganz. Ich bin aber ja auch kein DB-Experte, der die Interna der diversen DB-Engines kennt. Immerhin musst du mir zustimmen:
1. Es gibt ResultSets, die keine Kenntnis von Änderungen in der DB erlangen. Der Vorteil liegt in der hohen Performance, weil DB-Operationen anderer User nicht dem resultSet mitgeteilt werden müssen.
2. Es gibt ResultSets, die Kenntnis von Änderungen in der DB erlangen. Vorteil ist die Flexibilität, Nachteil die schlechtere Performance.

Und ich hatte halt nur die Idee, dass es noch ein Mittelding gibt, so ein ResultSet wie unter 1. beschrieben, das aber um neue Zeilen erweitert wird, wenn man über das resultSet selbst neue Datensätze einfügt. Das könnte ja sogar unabhängig von der DB realisiert sein. War der Gedanke so abwegig.? :D
Gruß!

reinski
 

bronks

Top Contributor
Reinski hat gesagt.:
Das VB ist schon gut, aber dafür ausgelegt, daß es für den Programmierer einfach ist. Das RecordSet macht sehr viele Sachen automatisch, welche man aus Performancegründen evtl. nicht automatisch haben möchte.

Daß Du mit Autowert einen Primärschlüssel erzeugst, das glaube ich Dir, aber was sagt dieser vom Inhalt aus? Auftragsnummer? Buchungsnummer? Lieferscheinnummer? Verrate mir das und ich sage Dir dafür, ob das einen Missbrauch darstellt und welche möglichen Nebenwirkungen Du erwarten kannst.

Ich verwende Autowerte nur als RowId, wenn diese gebraucht werden. Zu GUID würde ich auf jeden Fall raten. Wie ansetzen: Such mal in Goolge nach den beiden ganz oben gennanten Suchbegriffen. Auf der ersten Ergebnisseite geht es nur um das Thema. Im Wikipedia steht zu GUID auch ein sehr erleuchtender Satz.
 

Reinski

Mitglied
Meine IDs sind einfach nur Zeilen-IDs. Ich hab das noch aus alten Zeiten, wo die Datenbanken bei Beziehungen/Indices über LongInteger-Werte schneller waren als über Strings und es die GUIDs noch nicht gab.
Die IDs haben für den Datensatz keinerlei Bedeutung.

Danke für die Hinweise! Werd ihnen mal nachgehen... ;-)
Gruß!

reinski
 

Reinski

Mitglied
bronks hat gesagt.:
Im Wikipedia steht zu GUID auch ein sehr erleuchtender Satz.
Hehe, der mich erleuchtende Satz stand aber unter UUID: :D
Die Release 5.0 von Java stellt eine Klasse zur Verfügung, die 128-bittige UUID generiert.
Und die heisst java.util.UUID. Dann werd ich morgen die Sache mal ausprobieren.
Vielen Dank nochmal für Deine Hilfe!
Gruß

reinski
 

thE_29

Top Contributor
Code:
    PreparedStatement ps = conn.prepareStatement("SELECT nextval(?)");
    ps.setString(1, seq);


Wobei seq für den Namen des Increment Ding steht!

Bei mir wäre es tabelle_seq

Dh, du könntest auch gleich sagen "SELECT nextval('tabelle_seq');



Nachtrag: Also ohne ein statement absetzen geht das nicht... Bzw isses dann eben spezifiziert in den Treibern, aber wenn eh nur DU in der Datenbank adden tust, musst du 1mal auslesen und dann den counter immer adden!



Edit2: machs so ;)

Insert into tabelle (col1,col2,...) values (1,(select nextval('tabelle_seq')),....)



so gehts, habs grad ausprobiert ;)
 

SamHotte

Top Contributor
Wie wäre es, wenn du deine drei SQL-Befehle in eine Transaktion kapselst? Normalerweise sorgt dann das DBMS dafür, dass ein weiterer lesender oder schreibender Zugriff nur korrekte Zustände sieht ...
 

Leroy42

Top Contributor
Reinski hat gesagt.:
Und ich hatte halt nur die Idee, dass es noch ein Mittelding gibt, so ein ResultSet wie unter 1. beschrieben, das aber um neue Zeilen erweitert wird, wenn man über das resultSet selbst neue Datensätze einfügt. Das könnte ja sogar unabhängig von der DB realisiert sein. War der Gedanke so abwegig.? :D

Wohl doch nicht, wenn du es so beschreibst ist es mir schon verständlicher.
 

thE_29

Top Contributor
Falls es vorbeigegangen ist, so kann man es mit 1 befehl machen:

Code:
Insert into tabelle (col1,col2,...) values (1,(select nextval('tabelle_seq')),....)
 

Reinski

Mitglied
thE_29 hat gesagt.:
Falls es vorbeigegangen ist, so kann man es mit 1 befehl machen:

Code:
Insert into tabelle (col1,col2,...) values (1,(select nextval('tabelle_seq')),....)
Sorry, dass ich erst jetzt wieder rein schaue, aber ich war etwas beschäftigt... :-/

Ich verstehe nicht ganz, wo hier der Vorteil liegt. Mit dem SQL-Befehl würde man doch einfach den nächsten Autoinkrement-Wert auslesen und eine neue Zeile mit diesem Wert (explizit) anlegen, oder?
Da kann man doch auch gleich ein normales Insert machen, ohne einen Wert für die Autoinkrementspalte anzugeben, dann macht die DB die Arbeit und das Ergebnis ist genau dasselbe.

Vor allem aber ändert sich nichts an der Tatsache, dass ich danach immer noch nicht den Autoinkrementwert kenne, sondern ihn erst noch durch einen zweiten Zugriff feststellen muss.

Allerdings wäre der Vorschlag, das ganze in eine Transaktion zu packen, eine Prüfung wert... ;-)
Gruß!

reinski
 

thE_29

Top Contributor
Na dann habe ich das falsch verstanden :)

Jedenfalls kriegst du halt mit select nextval(..) den Wert raus!

Du wirst net über 2 Statements hinauskommen...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
L PostgreSQL Abfrage mit EclipseLink Datenbankprogrammierung 7
S Berechnung des Datumsunterschieds in der SQL-Abfrage Datenbankprogrammierung 1
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
nonickatall MySQL SQL Abfrage erneut ausführen oder rs aktualisieren Datenbankprogrammierung 14
Kirby.exe Verständnisproblem bei SQL Abfrage Datenbankprogrammierung 27
N SQL-Abfrage in JTextField ausgeben Datenbankprogrammierung 6
N java sql abfrage bestimmer Datumszeitraum Datenbankprogrammierung 9
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Bluedaishi Datenbank Abfrage Datenbankprogrammierung 36
W MySQL DB Abfrage in Array, gemischte Array, generelles vorgehen Datenbankprogrammierung 4
D SQL Abfrage optimieren Datenbankprogrammierung 35
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
D Regelmäßige Abfrage aus Workbench Datenbankprogrammierung 6
M SQL-Statement Hilfe bei SQL-Abfrage Datenbankprogrammierung 2
D Abfrage - Spalte(Datum) ändern (Oracle) Datenbankprogrammierung 7
D Datenbank Abfrage Datenbankprogrammierung 7
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
M MySQL Anbindung und Abfrage an die Datenbank Datenbankprogrammierung 2
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
E Abfrage auf HSQLDB Datenbankprogrammierung 4
M MySQL SQL Abfrage in JTable mit Berechnung Datenbankprogrammierung 3
S Abfrage von Gruppentickets(Mehrere Resorts an einem Tag) Datenbankprogrammierung 1
S SQL Abfrage Datenbankprogrammierung 2
F Abfrage der letzten Einträge Datenbankprogrammierung 2
J SELECT Abfrage/Suche Datenbankprogrammierung 4
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
OnDemand SQL Abfrage und Equals Datenbankprogrammierung 4
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
M MySQL MySQLSyntaxError in Java, obwohl Abfrage in HeidiSQL korrekt Datenbankprogrammierung 2
ruutaiokwu sql abfrage mit rekursion, mit oder ohne cte... Datenbankprogrammierung 5
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
L SQL-Abfrage bricht vor dem Ende ab Datenbankprogrammierung 2
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Derby/JavaDB Komplexe Abfrage vereinfachen Datenbankprogrammierung 2
S SQL-Abfrage, Filewriter .txt Datei Datenbankprogrammierung 2
P Datenbank- Abfrage mit null'en Datenbankprogrammierung 2
Bluedaishi MySQL Abfrage Problem :-) Datenbankprogrammierung 21
D MySQL Erstellen der richtigen Abfrage Datenbankprogrammierung 3
D MySQL DB Abfrage Prüfen Datenbankprogrammierung 10
D JDBC insert mit select abfrage Datenbankprogrammierung 5
E PostgreSQL Exception too ...many clients already bei DB-Abfrage Datenbankprogrammierung 14
M MySQL SQL Abfrage Problem Datenbankprogrammierung 6
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
H JSON Array abfrage beschleunigen Datenbankprogrammierung 2
S MySQL Abfrage: Wenn Feld leer, alles anzeigen Datenbankprogrammierung 5
Mrtwomoon Abfrage-Ergebnisse in einem Fenster darstellen Datenbankprogrammierung 8
0 SQL Abfrage Bestellung Datenbankprogrammierung 15
G SQLite SQLite Abfrage Datenbankprogrammierung 4
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
B My-SQL Abfrage - Out Of Memory Error Datenbankprogrammierung 13
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
K SQLite Einfache DB-Abfrage Datenbankprogrammierung 2
C Problem mit SQL-Abfrage Datenbankprogrammierung 5
C Sortierung bei SQL-Abfrage Datenbankprogrammierung 3
B Bei Abfrage schießt der Speicher in die Höhe Datenbankprogrammierung 6
M SQL Abfrage Dupliakte bei Kreuzvergleich Datenbankprogrammierung 2
M Access Abfrage mit Parameter & Access/Java liefern unterschiedliche Ergebnisse Datenbankprogrammierung 2
G SQL Abfrage Datenbankprogrammierung 5
C SQL-Abfrage Datenbankprogrammierung 4
B SQL-Abfrage Datenbankprogrammierung 4
R SQL Abfrage, je nach ausgewählten Parametern Datenbankprogrammierung 11
C Wert in SQL-Abfrage zählen lassen Datenbankprogrammierung 8
R Memory leaks bei DB Abfrage Datenbankprogrammierung 16
S Abfrage auf SQLite-DB Datenbankprogrammierung 2
I Belastet es das System zu sehr einen Timer jede 0.2 Sekunden eine DB Abfrage machen zu lassen? Datenbankprogrammierung 9
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G Abfrage von Teilnehmern Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
A MySQL Ergebnss aus SQL Abfrage in Hauptklasse verwenden Datenbankprogrammierung 3
N Geschwindigkeit bei if Abfrage Datenbankprogrammierung 11
J sql abfrage ... Problem mit Datumswert Datenbankprogrammierung 3
G Performante SQL- Abfrage (LIKE %) Datenbankprogrammierung 21
G Join Abfrage Datenbankprogrammierung 12
M db abfrage fehlerhaft Datenbankprogrammierung 5
C MySQL Abfrage mit flexibler WHERE bedingung Datenbankprogrammierung 10
C Datenbank-Abfrage, if im Select Datenbankprogrammierung 9
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
H SQL Abfrage - zwei tabellen vergleichen. Datenbankprogrammierung 2
H MySQL Datenbank Abfrage Datenbankprogrammierung 10
André Uhres SQL Abfrage erkennt keine Buchstaben mit Akzenten (z. B. é, è) Datenbankprogrammierung 3
E MySQL Klasse zur Abfrage statisch oder Standard Datenbankprogrammierung 5
J Mit einer Abfrage Worte suchen die in Zwei Tabellen enthalten sind Datenbankprogrammierung 5
G M:N Abfrage Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben