Id über auto_increment ...

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Id über auto_increment ...

Beitrag von UliTs »

Hallo allerseits,

ich muß bei einer Tabelle, die als Id ein auto_increment-Feld hat, nach insert eines neuen Datensatzes die dabei vergebene Id herausbekommen. Das muß doch irgendwie gehen! Nur wie?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Id über auto_increment ...

Beitrag von UliTs »

Ich habe gerade eine Lösung mittels
'select Last_Insert_Id() ...
gefunden.

Uli

P.S.
Ist in diesem Fall nicht ADS sondern MySql...
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Id über auto_increment ...

Beitrag von ramses »

Versuch mal

Code: Alles auswählen

insert into database (feld1,feld2, ....) values (1,2, ...) returning id;
Das gibt dir beim insert gleich auch noch die ID zurück. Jedenfalls unter PostgreSQL....
Valar Morghulis

Gruss Carlo
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Id über auto_increment ...

Beitrag von georg »

Hallo,


unter PostgreSQL geht es auch mittels

Code: Alles auswählen

SELECT LastVal()
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Id über auto_increment ...

Beitrag von UliTs »

Vielen Dank für die Infos...
"returning Id" scheint es unter MySql nicht zu geben. Wobei ich diese Lösung besser finde.
Ohne Informationen über die generierte Id ist meines Erachten ein auto_increment-Feld sinnlos. Gibt es vielleicht unter Standard-Sql eine Möglichkeit, die Id herauszubekommen?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Id über auto_increment ...

Beitrag von Werner_Bayern »

UliTs hat geschrieben: Do, 20. Jun 2019 21:42 Ohne Informationen über die generierte Id ist meines Erachten ein auto_increment-Feld sinnlos. Gibt es vielleicht unter Standard-Sql eine Möglichkeit, die Id herauszubekommen?
ein einfaches

Code: Alles auswählen

select id where ...
nach dem insert?
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Id über auto_increment ...

Beitrag von georg »

Hall,


es ist einfach so, dass der SQL-Standard das nicht vorsieht. Daher gibt es - wie auch in anderen Sprachen, z.B. COBOL - herstellerspezifisches Erweiterungen.

Aber das funktioniert recht gut mit dem Abfragen via LastVal() und Co. und ist sicherer als ein Zugriff über nicht zwingend eindeutige Schlüssel.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Id über auto_increment ...

Beitrag von UliTs »

Werner_Bayern hat geschrieben: Fr, 21. Jun 2019 14:50
UliTs hat geschrieben: Do, 20. Jun 2019 21:42 Ohne Informationen über die generierte Id ist meines Erachten ein auto_increment-Feld sinnlos. Gibt es vielleicht unter Standard-Sql eine Möglichkeit, die Id herauszubekommen?
ein einfaches

Code: Alles auswählen

select id where ...
nach dem insert?
Das Problem ist ja, dass man dann einen zweiten Primärschlüssel brauchen würde und somit das auto_increment-Feld sinnlos wäre ;-) .
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Id über auto_increment ...

Beitrag von Werner_Bayern »

UliTs hat geschrieben: Fr, 21. Jun 2019 16:48Das Problem ist ja, dass man dann einen zweiten Primärschlüssel brauchen würde und somit das auto_increment-Feld sinnlos wäre ;-) .
Nicht unbedingt - ich kenne aber Deine Datenstruktur nicht. Kann Dein neuer Datensatz nicht doch mit einem select und entsprechenden Werten ermittelt werden? Ich mache das z. B. so:

Code: Alles auswählen

oSQL:select(cFelder + " from " + cDatei + " WHERE erst_von = " + ltrim(str(nBenutzer)) + " order by erstellt DESC, erstelltum DESC LIMIT 1")
Weil ich vorher beim insert erst_von, Datum und Uhrzeit einfüge.
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Id über auto_increment ...

Beitrag von georg »

Hallo, Werner -


bei MySQL ist auf jeden Fall ein zweiter Zugriff erforderlich, sei es Deine Variante oder SELECT last_insert_id(). Dabei ziehe ich persönlich die letzte Variante vor, weil sie weniger Spielraum für Fehler hat. Wenn Kollege Maier zweimal angemeldet ist (eine studentische Aushilfskraft, die noch kein eigenes Profil hat und seines "mitbenutzt"), dann kann es schon mal zwei Sätze geben, die Deinem Kriterium entsprechen. Und Du merkst es nicht einmal, weil Du durch das "LIMIT 1" genau diese Erkennung unterdrückst.

Zugegeben, die Wahrscheinlichkeit ist gering, aber eine solche Situation bleibt doch möglich.


Ach so, das "returning" bei PostgreSQL hätte ich vor einer Woche gut gebrauchen können, hätte mir ein paar hunderttausend "SELECT LastVal()" erspart. Schön, dass man hier immer noch dazulernen kann!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Id über auto_increment ...

Beitrag von Werner_Bayern »

Servus Georg,

aktuell geht aber returning nicht, weder mittels DacSqlStatement() noch mit executeStatement(). Habs an Alaska bereits gemeldet.

Da ist aktuell die beste Methode wie von Dir geschrieben:

Code: Alles auswählen

select lastval()
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Id über auto_increment ...

Beitrag von georg »

Hallo, Werner -


Du solltest es mit :executeQuery() versuchen, da m.E. nur dort ein Result Set zurückgeliefert wird. Ausprobiert habe ich das aber noch nicht.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Id über auto_increment ...

Beitrag von Werner_Bayern »

Servus Georg,

danke, manchmal sehe ich den Wald, aber die Bäume nicht :)

So geht's selbstverständlich. Also insert ohne returning mit executeStatement() und mit executeQuery().
es grüßt

Werner

<when the music is over, turn off the lights!>
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Id über auto_increment ...

Beitrag von ramses »

Hallo

oder aber auf die PGDBE verzichten und die native Methode PQexec und Familie verwenden. Da stehen dann uneingeschränkt alle Features von Postgresql zur Verfügung. Nachteil: Man muss sich selbst um alles kümmern...
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Id über auto_increment ...

Beitrag von Werner_Bayern »

Servus Carlo,

das würde in diesem Fall aber nichts ändern.
es grüßt

Werner

<when the music is over, turn off the lights!>
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Id über auto_increment ...

Beitrag von ramses »

Hallo Werner

ändern? Nun es würde einfach so funktionieren wie es in der umfangreichen Dokumentation von Postgresql beschrieben ist. MIt den executeStatement() und mit executeQuery() sind Funktionen zwischen dir und der Datenbank und du bist von dieser Zwischenschicht abhängig.
Wenn dir andere Personen die Abfragen (Kommunikation und Umwandlungen) vorbereiten geht es mit den nativen Funktionen einfacher dies umzusetzten da du genau die erwähnten Befehleaufrufen kannst.
Am Ergebnis ändern, wenn du eins bekommst tut es sicher nichts.
Valar Morghulis

Gruss Carlo
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Id über auto_increment ...

Beitrag von UliTs »

ramses,

ich verstehe Deinen Beitrag nicht. Wie bekommt bei PostGreSql man die id nach dem Einfügen heraus?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Id über auto_increment ...

Beitrag von georg »

Hallo, Uli -


wir reden hier gerade über PostgreSQL. Die hier beschriebene Möglichkeit gibt es bei MySQL nicht.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Id über auto_increment ...

Beitrag von UliTs »

georg hat geschrieben: Mo, 24. Jun 2019 12:58 Hallo, Uli -
wir reden hier gerade über PostgreSQL. Die hier beschriebene Möglichkeit gibt es bei MySQL nicht.
Ja, natürlich redet Ihr über ProstgreSQL. Deswegen habe ich ja nachgefragt, wie es da geht.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Id über auto_increment ...

Beitrag von georg »

Hallo, Uli -


da gibt es zwei (von vielen, vielen) Möglichkeiten:

Einen

Code: Alles auswählen

INSERT ... RETURNING idnum
als Query ausführen. Normalerweise reicht es bei einem INSERT ja aus, den SQL-String als Statement ausführen zu lassen. Mit GIVING und als Query bekommst Du ein Result Set zurück, das als einziges Feld den automatisch vergebenen Feldwert enthält, also den PRIMARY KEY des neuen Satzes.

Die zweite Möglichkeit besteht darin, den INSERT wie gehabt auszuführen, und danach mittels

Code: Alles auswählen

SELECT LastVal()
auszuführen. Du bekommst wieder ein Result Set zurück, das den letzten automatisch vergebenen Feldwert zurückliefert. (Quasi so, wie Du es unter MySQL machst.)
Zuletzt geändert von georg am Mo, 24. Jun 2019 18:03, insgesamt 1-mal geändert.
Grund: falsches Schlüsselwort korrigiert
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Id über auto_increment ...

Beitrag von UliTs »

Vielen Dank.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Id über auto_increment ...

Beitrag von Werner_Bayern »

ramses hat geschrieben: So, 23. Jun 2019 23:17 Hallo Werner

ändern? Nun es würde einfach so funktionieren wie es in der umfangreichen Dokumentation von Postgresql beschrieben ist. MIt den executeStatement() und mit executeQuery() sind Funktionen zwischen dir und der Datenbank und du bist von dieser Zwischenschicht abhängig.
Servus Carlo,

hier liegt vermutlich das Missverständnis: Die beiden Methoden sind ja bereits low-level-Methoden, mit denen kann ich alles machen, was ich aktuell mit dem PostgreSQL brauche. Klappt alles einwandfrei und schnell. Die von Alaska ausgelieferte libpqex.dll ist nach meinem Verständnis eh die von Dir angesprochene libpq.dll, nur eine ältere Version.
Wenn dir andere Personen die Abfragen (Kommunikation und Umwandlungen) vorbereiten geht es mit den nativen Funktionen einfacher dies umzusetzten da du genau die erwähnten Befehleaufrufen kannst.
Am Ergebnis ändern, wenn du eins bekommst tut es sicher nichts.
Ich war hier einfach zu blöd, aber Georg hat mir geholfen und das meinte ich auch: Ein insert ist ein Statement, das über executeStatement() geschickt werden muss, ein insert mit returning ist ein Statement mit einer anschließenden Abfrage (Query), also muss es mit executeQuery() gemacht werden. Das ist sicherlich bei der von Dir beschriebenen Vorgehensweise genauso nötig.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Id über auto_increment ...

Beitrag von Werner_Bayern »

georg hat geschrieben: Mo, 24. Jun 2019 14:07 da gibt es zwei (von vielen, vielen) Möglichkeiten:
Oder wie schon vorher von Carlo gezeigt mittels returning:

Code: Alles auswählen

insert into mytabelle (blabla) VALUES (blabla) returning id (oder auch returning *)
es grüßt

Werner

<when the music is over, turn off the lights!>
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Id über auto_increment ...

Beitrag von ramses »

Hallo Werner
also muss es mit executeQuery() gemacht werden. Das ist sicherlich bei der von Dir beschriebenen Vorgehensweise genauso nötig.
Nein, ich verwende momentan für alle Postgres Datenbankabfragen die PQexec Funktion und andere aus der PQLib. Die executeQuery() usw. und die ganze PGDBE war bis jetzt eigentlich immer nur die Ursache für Sorgen und Probleme....
Die von Alaska ausgelieferte libpqex.dll ist nach meinem Verständnis eh die von Dir angesprochene libpq.dll, nur eine ältere Version.
Ja, das ist die Version 8.3 aus 2008 mit einem EndOfLife Datum von Dez. 2013 sowas ausgemustertes sollte man doch nicht mehr verwenden!

Es soll ja demnächst ein neues Update von Xbase geben welches massive Verbesserungen der gesamten PGDBE bringen soll. Was bitter nötig wäre.

Leider ist die PGDBE aktuell noch nicht benutzbar. Ein Upsize einer einzigen Datenbank mit xbase 2.00.1095 benötigte gestern 10 Stunden!!!
Zur Umstellung aller benötigten alten Datenbanken/bestände von DBF(ADS) auf PGDBE wären so in einem Werk etwa 400 Stunden erforderlich was schlicht nicht möglich ist. Vermutlich sind die Würfel ja auch bereits gefallen, denn solange die ISAM Emulation derart langsam ist und auf schon längs abgekündigten und EndOfLife Baugruppen aufbaut benutze ich wohl besser auch die auf den veralteten DLL's aufbauenden Funktionen wie executeQuery() usw. nicht. Irgendwann ist dann auch der gesamte Code bezw. alle Apps umgeschrieben und alles läuft mit nativ PQ der neusten Generation und vorallem auch durchgängig mit UTF8 ..... (was ja nun für Web-Apps absolut zwingend ist)

Ach ja, der Transfer der oben genannten Datenbank benötigte mit nativem Postgresql in eine native Datenbank unter 5 Minuten .......

Ich bin der überzeugung dass das nächste Alaska Update wie angekündigt alle Problem löst und auch die aktuelle Datenbankschnittstelle PQlib mitbringt.....
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Id über auto_increment ...

Beitrag von Werner_Bayern »

ramses hat geschrieben: Mo, 24. Jun 2019 23:14 Nein, ich verwende momentan für alle Postgres Datenbankabfragen die PQexec Funktion und andere aus der PQLib. Die executeQuery() usw. und die ganze PGDBE war bis jetzt eigentlich immer nur die Ursache für Sorgen und Probleme....
Das meinte ich nicht, sondern Du musst doch auch mit der Pqlib unterscheiden, ob Du ein Statement ausführst, oder ein Query. Nichts anderes sind die 2 Xbase++ - Methoden.
Ach ja, der Transfer der oben genannten Datenbank benötigte mit nativem Postgresql in eine native Datenbank unter 5 Minuten .......
Unter gleichen Voraussetzungen? Also beides mal Transfer übers Netz, oder war es nicht so, dass im 2. Fall alles direkt am Server durchgeführt wurde?
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten