Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Autoincwert zurück bekommen (https://www.delphipraxis.net/201553-autoincwert-zurueck-bekommen.html)

mcinternet 31. Jul 2019 16:17

Datenbank: mysql • Version: 8.0.15 • Zugriff über: MyDAC

Autoincwert zurück bekommen
 
Hallo die Gemeinde,

ich stehe hier irgendwie wie ein Ochs vorm Berg und sehe den Wald vor lauter Bäumen nicht.

Ich mache ein query.insert - es werden auch alle Werte eingetragen.
Nur die ID (unique, autoinc) bekomme ich nicht ausgelesen. Auch nicht nach query.post :?::?::?:

Wie kann ich diesen Wert - am liebsten direkt nach query.insert - bekommen?

also in der Form: meinwert := queryID.asInteger;

beste Grüße aus dem Odenwald

mcinternet

mkinzler 31. Jul 2019 16:21

AW: Autoincwert zurück bekommen
 
SQL-Code:
select LAST_INSERT_ID() from ...

mcinternet 31. Jul 2019 16:27

AW: Autoincwert zurück bekommen
 
Zitat:

Zitat von mkinzler (Beitrag 1438474)
SQL-Code:
select LAST_INSERT_ID() from ...


Greift das vor dem qry.post oder danach?

Gruss

mcinternet

mkinzler 31. Jul 2019 16:32

AW: Autoincwert zurück bekommen
 
Danach. Liefert immer die letzte ID einer Sitzung.

https://www.devart.com/mydac/docs/de...t.insertid.htm

mcinternet 31. Jul 2019 16:39

AW: Autoincwert zurück bekommen
 
@mkinzler

Vielen lieben Dank :thumb::thumb:

Problem ist damit gelöst *hauvorKopp* :roll::roll:

Beste Grüße aus dem Odenwald

mcinternet

Sherlock 1. Aug 2019 07:52

AW: Autoincwert zurück bekommen
 
Etwas eleganter ist doch
Code:
insert into table...returning autoinc_field
Sherlock

mkinzler 1. Aug 2019 07:56

AW: Autoincwert zurück bekommen
 
Zitat:

Zitat von Sherlock (Beitrag 1438758)
Etwas eleganter ist doch
Code:
insert into table...returning autoinc_field
Sherlock

Wenn das in MySQL funktioniert.

generic 1. Aug 2019 08:13

AW: Autoincwert zurück bekommen
 
Ich muss ja gestehen ich bin kein Fan von Funktionen wie LAST_INSERT_ID().
Dabei ist es egal welche Datenbank das ist.

Folgende Frage sollte man sich stellen:
Was passiert wenn mehrere Datensätze eingefügt werden? Denn INSERT aus eine SELECT kann es.
Was passiert wenn ein INSERT Trigger auslöst wird, welcher einen weiteren Datensatz in eine andere Tabelle einträgt. Welche ID bekommt man dann zurück?

Daher verfolge ich immer strikt den Ansatz (beim MSSQL) das ich die OUTPUT Option bei INSERT nutze. Das liefert mir dann ein RESULTSET zurück, was wirklich in meiner Tabelle angelegt wurde und dessen IDs.

mcinternet 1. Aug 2019 08:16

AW: Autoincwert zurück bekommen
 
Zitat:

Zitat von generic (Beitrag 1438761)
Daher verfolge ich immer strikt den Ansatz (beim MSSQL) das ich die OUTPUT Option bei INSERT nutze. Das liefert mir dann ein RESULTSET zurück, was wirklich in meiner Tabelle angelegt wurde und dessen IDs.

@generic: ich bitte da um nähere Erläuterung

vielen Dank


beste Grüße

mcinternet

mkinzler 1. Aug 2019 08:24

AW: Autoincwert zurück bekommen
 
Last_insert_id() könnte theoretisch auch die falsche ID zurückliefern, da das "Holen" der ID ja nicht innerhalb der Abfrage erfolgt.
das returning von PosGresSQL/FireBird/... liefert den Wert als Teil der Abfrage zurück. OUTPUT von MSSQL liefert sogar wohl den kompletten Datensatz.

Sherlock 1. Aug 2019 11:04

AW: Autoincwert zurück bekommen
 
Wie ich gerade lesen konnte ist Last_Insert_ID verbindungsbezogen. Das bedeutet, selbst wenn andere gleichzeitig Datensätze anlegen, Last_Insert_ID gibt für die aktuelle Sitzung/Verbindung die korrekte letzte ID zurück. Aufwändig, aber wenn returning nicht unterstützt wird (Oracle muss halt MySQL irgendwie kleiner halten als das Hauptprodukt) die einzige Möglichkeit.

Sherlock

generic 1. Aug 2019 11:25

AW: Autoincwert zurück bekommen
 
Kein Problem hier eine Demo für der MSSQL! (nicht MYSQL):

Code:
CREATE TABLE [dbo].[Demo](
   [Id] [int] IDENTITY(1,1) NOT NULL,
   [Text] [varchar](max) NOT NULL,
 CONSTRAINT [PK_Demo] PRIMARY KEY CLUSTERED
(
   [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Nun der Insert:
Code:
INSERT INTO [dbo].[Demo] ([Text])
output inserted.Id, inserted.Text
VALUES ('Hund'),
('Katze'),
('Maus')
GO
Liefert als Resultset:
Code:
1   Hund
2   Katze
3   Maus
Sprich, dass was ich einfüge dafür habe ich auch die exakten Keys. Also nicht das was vielleicht noch im Hintergrund abläuft durch Trigger oder parallel laufenden Prozessen.

mkinzler 1. Aug 2019 11:29

AW: Autoincwert zurück bekommen
 
Es geht aber um MySQL!

generic 5. Aug 2019 08:16

AW: Autoincwert zurück bekommen
 
Zitat:

Zitat von mkinzler (Beitrag 1438797)
Es geht aber um MySQL!

Aus diesem Grund habe ich bei jeden meiner Beiträge MSSQL beigeschrieben und dennoch hat jemand nach Details gefragt. Evtl. gibt es ähnliche Funktionen auch im MYSQL.

taveuni 5. Aug 2019 10:59

AW: Autoincwert zurück bekommen
 
Zitat:

Zitat von generic (Beitrag 1438792)
Kein Problem hier eine Demo für der MSSQL! (nicht MYSQL):

Nun der Insert:
Code:
INSERT INTO [dbo].[Demo] ([Text])
output inserted.Id, inserted.Text
VALUES ('Hund'),
('Katze'),
('Maus')
GO
Liefert als Resultset:
Code:
1   Hund
2   Katze
3   Maus
Sprich, dass was ich einfüge dafür habe ich auch die exakten Keys. Also nicht das was vielleicht noch im Hintergrund abläuft durch Trigger oder parallel laufenden Prozessen.


Wow! Das kannte ich noch nicht. Ich hole immer mit @@Identity die ID mit einer separaten Query nach dem Insert. Aber wie kann das Resultset mit der Output Query geholt werden? Ist es Qry.FieldByName('Inserted.Id') oder so? Und wie ist die Performance verglichen mit einem "normalen" Insert?

Aviator 5. Aug 2019 11:25

AW: Autoincwert zurück bekommen
 
Zitat:

Zitat von taveuni (Beitrag 1439475)
Wow! Das kannte ich noch nicht. Ich hole immer mit @@Identity die ID mit einer separaten Query nach dem Insert. Aber wie kann das Resultset mit der Output Query geholt werden? Ist es Qry.FieldByName('Inserted.Id') oder so? Und wie ist die Performance verglichen mit einem "normalen" Insert?

Richtig. Oder eben das Pendant qry.Fields[i]. Zudem ist zu beachten, dass anstelle eines ExecSQL() ein Open() gemacht werden muss, da ein ExecSQL() keine Daten zurückliefert.

hhcm 5. Aug 2019 12:04

AW: Autoincwert zurück bekommen
 
Kennt MyDac

Delphi-Quellcode:
Query.LastInsertId
nicht?

Edit: Bei MyDAC ist es Query.InsertId .. LastInsertId ist von UniDac


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