AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird gen_id()

Ein Thema von CoLT · begonnen am 10. Nov 2005 · letzter Beitrag vom 10. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
CoLT

Registriert seit: 10. Nov 2005
Ort: Remscheid
9 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Firebird gen_id()

  Alt 10. Nov 2005, 12:05
Datenbank: Firebird • Version: 1.5 • Zugriff über: dBExpress
Gibt es eine Möglichkeit auf eine generierte ID nach dem Insert zuzugreifen ?

Der Select auf den Generator(tabelle) selber ist keine Lösung, da bei Multiusing die Gefahr besteht, dass ich die ID von einem anderen Insert bekomme.

Bei Informix gibt es die Moeglichkeit den SQLCA Record auszulesen, mit einem Staus der letzten DB-Aktion sozusagen. Dort finde ich auch den Wert der serial Feldes.

Bei MS-SQL gibt es die Methode "SELECT @@IDENTITY" was auch super funktioniert.

Nur bei Firebird sehe ich derzeit keine andere Möglichkeit als mir einen neue ID vor dem INSERT zu reservieren.


Ich hoffe es kann mir jemand helfen ...


mfg CoLT
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Firebird gen_id()

  Alt 10. Nov 2005, 12:21
Da war doch irgendwas in der Art
select gen_id (GeneratorName) wenn ich mich täusche.
  Mit Zitat antworten Zitat
CoLT

Registriert seit: 10. Nov 2005
Ort: Remscheid
9 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Firebird gen_id()

  Alt 10. Nov 2005, 12:43
das geht nicht wenn 2 inserts gleichzeitig passieren ...(multiusing)
  Mit Zitat antworten Zitat
dfried

Registriert seit: 16. Aug 2005
486 Beiträge
 
#4

Re: Firebird gen_id()

  Alt 10. Nov 2005, 12:51
Zitat von CoLT:
das geht nicht wenn 2 inserts gleichzeitig passieren ...(multiusing)
Warum nicht?!?
Gen_id liefert (soweit ich weis) immer den nächsten Generatorwert unabhängig von einer Transaktion zurück.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Firebird gen_id()

  Alt 10. Nov 2005, 12:55
Zitat von dfried:
Gen_id liefert (soweit ich weis) immer den nächsten Generatorwert unabhängig von einer Transaktion zurück.
Nicht den nächsten, sondern den aktuellen. Und wenn Du ein Insert und die anschliessende gen_id Abfrage innerhalb von einer Transaktion durchführst, kann da nichst passieren.
  Mit Zitat antworten Zitat
dfried

Registriert seit: 16. Aug 2005
486 Beiträge
 
#6

Re: Firebird gen_id()

  Alt 10. Nov 2005, 13:01
Ich würde das dann eher andersrum machen, sonst kann wirklich ein Problem mit "gleichzeitigen Inserts entstehen.

Also zuerst SELECT GEN_ID(MY_GENERATOR, 1) und dann im INSERT INTO den soeben ermittelten Generatorwert als PK mit reinschreiben.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Firebird gen_id()

  Alt 10. Nov 2005, 13:03
Herzlich willkommen in der Delphi-PRAXiS, CoLT.

Auch in FireBird kannst du - innerhalb einer Transaktion - den Generatorwert nach der Zuweisung im INSERT auslesen. Mehr dazu hier: klick

Grüße vom marabu
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Firebird gen_id()

  Alt 10. Nov 2005, 13:15
@marabu: Das verhindert aber nicht, dass jemand den Generatorwert inzwischen durhc nen anderen Insert verändert hat!

Die Lösung von dfried ist korrekt. Alternativ könntest Du das ganze dann noch in ne StordeProcedure verlegen (also den Insert) und die Prozedur den Wert zurückgeben lassen....

Grüße
Lemmy
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Firebird gen_id()

  Alt 10. Nov 2005, 13:18
Zitat von dfried:
Also zuerst SELECT GEN_ID(MY_GENERATOR, 1) und dann im INSERT INTO den soeben ermittelten Generatorwert als PK mit reinschreiben.
Eben genau nicht. Du fügst ganz normal deinen Record hinzu, und über einen Trigger ermittelst du dir die gen_id. Nach dem Insert ist für dich, und nur für dich, der aktuelle gen_id wert der Wert, den du beim Insert verwendest hast.

Wie Marabu verlinkt hat, lies Dir mal was in Sachen Transaktionen auf DB Server durch.
  Mit Zitat antworten Zitat
dfried

Registriert seit: 16. Aug 2005
486 Beiträge
 
#10

Re: Firebird gen_id()

  Alt 10. Nov 2005, 13:32
Zitat von Jelly:
Eben genau nicht. Du fügst ganz normal deinen Record hinzu, und über einen Trigger ermittelst du dir die gen_id. Nach dem Insert ist für dich, und nur für dich, der aktuelle gen_id wert der Wert, den du beim Insert verwendest hast.
Sorry, komm halt aus der ORACLE-Welt und kenn FB nur am Rande. Und bei ORACLE sind die Sequence-Werte halt vollkommen Transaktionsunabhängig, da würde es so nicht funktionieren, dafür gibts dort wieder andere Möglichkeiten sowas zu machen

Zitat von Jelly:
Wie Marabu verlinkt hat, lies Dir mal was in Sachen Transaktionen auf DB Server durch.
Ich glaub das ist nicht unbedingt notwendig, das prinzip von Transaktionen kenn ich glaub ich nach acht Jahren Programmieerfahrung mit ORACLE gut genug.
Aber wie gesagt, lässt sich nicht für alle "DB-Server" pauschalieren.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz