Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firedac MySQL PK abrufen nach Update or insert (https://www.delphipraxis.net/214355-firedac-mysql-pk-abrufen-nach-update-insert.html)

Kostas 31. Dez 2023 19:50

Datenbank: MySQL • Version: 5.7 • Zugriff über: FireDac

Firedac MySQL PK abrufen nach Update or insert
 
Hallo Zusammen,

in Firebird 3.0 kann ich UPDATE OR INSERT INTO ausführen und den AutoInc PK abrufen in einen Rutsch.

Code:
UPDATE OR INSERT INTO Tabelle(PK_ID, Feld1, Feld2)
VALUES (:Feld1, :Feld2)
MATCHING (Feld1, Feld2)
RETURNING PK_ID INTO :PK_ID
Hat jemand eine Idee wie das bei MySQL über FireDac funktioniert?

Es geht wohl mit
Code:
SELECT LAST_INSERT_ID()
aber wie wird das eingebunden oder muss ich das Insert und das Update selbst separat ausführen und als nächstens einzeln das Select ausführen? Wenn ja, wird sich hoffentlich das select auf meine letzte Aktion auswirken und wirklich meinen letzten PK aus der Tabelle zurück liefern und nicht den letzten PK falls in der Zwischenzeit ein anderer User ein Record in die Tabelle hinzugefügt hat.

TurboMagic 1. Jan 2024 09:37

AW: Firedac MySQL PK abrufen nach Update or insert
 
Sowas funktioniert:

Delphi-Quellcode:
      FQuerySave.SQL.Text := 'select My_PK, MY_DATA_COL ' +
                            'from MYTABLE';

      FQuerySave.Open;
      FQuerySave.Append;

      FQuerySave.FieldByName('MY_DATA_COL').AsInteger := 123;
      FQuerySave.Post;

      Result := FQuerySave.FieldByName('My_PK').AsInteger;
      FQuerySave.Close;
Grüße
TurboMagic

Uwe Raabe 1. Jan 2024 11:06

AW: Firedac MySQL PK abrufen nach Update or insert
 
Das LAST_INSERT_ID ist aber auch nur dann sinnvoll, wenn tatsächlich ein INSERT ausgeführt wurde.

Kostas 1. Jan 2024 13:01

AW: Firedac MySQL PK abrufen nach Update or insert
 
Ich habe es jetzt anders gelöst indem ich vorher über ein Select nachschaue ob der Datensatz schon da ist. Wenn ja führe ich ein Update aus. Wenn nicht ein Insert.
Dennoch würde mich das interessieren ob es mit MySQL und Firedac irgend wie geht.

Uwe Raabe 1. Jan 2024 14:42

AW: Firedac MySQL PK abrufen nach Update or insert
 
Es geht bei FireDAC schon so wie Markus das beschrieben hat (übrigens auch für andere DBs als MySQL). Auch da muss man vorher entscheiden, ob man ein Append oder Edit macht. Mit den passenden Optionen hat man aber nach dem Post auch den korrekten neuen PK im entsprechenden Feld.

himitsu 1. Jan 2024 17:41

AW: Firedac MySQL PK abrufen nach Update or insert
 
Wenn das ein AutoInc ist, dann geht es nur, wenn UpdateAfterPost aktiv ist und dass des auch funktioniert, also FireDAC auch ein passendes WHERE sich bastelt.

Kostas 1. Jan 2024 19:49

AW: Firedac MySQL PK abrufen nach Update or insert
 
Ich habe das jetzt mit zwei FDCommand (Insert und Update) und einer FDQuery zum abrufen ob der Datensatz vorhanden ist, umgesetzt. Wenn je Query den Datensatz findet, liefert sie den PK zurück. Ist der PK = 0 dann wird ein FDCommand für Insert gefeuert. Der PK wird dann über
Code:
GetLastAutoGenValue
abgerufen. Ist der PK größer dann wird mit einem weiteren FDCommand ein Update durchgeführt.
Mit Firebird geht das alles in einem Aufruf mit einem FDCommand.

himitsu 1. Jan 2024 21:19

AW: Firedac MySQL PK abrufen nach Update or insert
 
Man kann beim TFDQuery aber auch ein eigenes Insert-Statement hinterlegen, anstatt das automatisch Generierte zu nutzen, also wenn man noch ein TFDUpdateSQL anhängt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 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