Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi mySQL - ID eines neuen Datensatzes ermitteln? (https://www.delphipraxis.net/16281-mysql-id-eines-neuen-datensatzes-ermitteln.html)

Sharky 14. Feb 2004 11:04


mySQL - ID eines neuen Datensatzes ermitteln?
 
Hai,

gibt es eine möglichkeit die ID (autoincrement-Feld) eines neuen Datensatzes bei einem mySQL-Servers zu ermitteln?

Ich brauche diese innerhalb meines Programmes. Oder hat jemand einen anderen tipp für mich?
Ich könnte natürlich als "ID-Feld" eine GUID verwenden aber das ist ja wohl nicht das ware ;-)

r_kerber 14. Feb 2004 12:14

Re: mySQL - ID eines neuen Datensatzes ermitteln?
 
Hallo Sharky,

habe dazu folgendes gefunden. Vielleicht hilft es Dir weiter.
Zitat:

Zitat von MySQL Manual
19.2.6 How to Get the Value of an AUTO_INCREMENT Column in ODBC

A common problem is how to get the value of an automatically generated ID from an INSERT. With ODBC, you can do something like this (assuming that auto is an AUTO_INCREMENT field):

INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();
Or, if you are just going to insert the ID into another table, you can do this:

INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');
See section 19.1.12.3 How to Get the Unique ID for the Last Inserted Row.

For the benefit of some ODBC applications (at least Delphi and Access), the following query can be used to find a newly inserted row:

SELECT * FROM tbl_name WHERE auto IS NULL;


Chewie 14. Feb 2004 12:21

Re: mySQL - ID eines neuen Datensatzes ermitteln?
 
In der C-API und der PHP-API gibt es außerdem noch den Befehl mysql_insert_id(). Eine Bibliothek, die auf dieser API aufsetzt, kapselt diese Funktion vielleicht.

ahachmann 14. Feb 2004 13:12

Re: mySQL - ID eines neuen Datensatzes ermitteln?
 
Hallo,
Ansonsten könnte man auch einfach einen Timestamp in den Datensatz mit einbauen.
Wenn evtl. viele gleichzeitig auf die Datenbank zugreifen, dann könnte es sein, das die Last ID schon die ID eines weiteren eingefügten Datensattzes ist.
Wenn Du aber einen Timestamp mit einfügst, und auf diesen Timestamp einen query machst, wird mit der Genauigkeit des Timestamps die wahrscheinlichkeit den falschen Datensatz zu erwischen immer geringer.
Gruß,
Alexander

teebee 14. Feb 2004 13:24

Re: mySQL - ID eines neuen Datensatzes ermitteln?
 
Zitat:

Zitat von ahachmann
Wenn evtl. viele gleichzeitig auf die Datenbank zugreifen, dann könnte es sein, das die Last ID schon die ID eines weiteren eingefügten Datensattzes ist.

Bei MySQL (und vermutlich auch bei allen anderen) wird die letzte ID für jede Verbindung einzeln gespeichert, man kriegt also immer seine eigene ID zurück, egal wer in der Zwischenzeit schon von einem anderen Client auf die DB zugegriffen hat:
Zitat:

Zitat von MySQL-Doku
The most recently generated ID is maintained in the server on a per-connection basis. It will not be changed by another client. It will not even be changed if you update another AUTO_INCREMENT column with a non-magic value (that is, a value that is not NULL and not 0).

Gruß, teebee

[edit]Doku-Auszug eingefügt[/edit]

Sharky 16. Feb 2004 16:02

Re: mySQL - ID eines neuen Datensatzes ermitteln?
 
Hai ihr,

danke für die Antworten :dancer:

Mit diesem Code habe ich es jetzt gelöst:

Delphi-Quellcode:
with DataModule1.ZQuery1 do
begin
  close;
  SQL.Clear;
  SQL.Add('INSERT INTO standorte (bezeichnung) VALUES (:bezeichnung)');
  Params[0].AsString := E_Bezeichnung.Text;
  ExecSQL;
  Close;
  SQL.Clear;
  SQL.Add('SELECT LAST_INSERT_ID()');
  Open;
  i_standortid := Fields[0].AsInteger;
  Close;
end;

Robert_G 16. Feb 2004 20:14

Re: mySQL - ID eines neuen Datensatzes ermitteln?
 
Gibt es keine Returning-Clause für DML-Statements in mySQL? :gruebel:
Müsste dann ungefähr so aussehen:
Delphi-Quellcode:
  With Query Do
  Begin
    SQL.Text :=
      'INSERT INTO xyz.Table1' + #10 +
      ' VALUES ( :i_F1, :i_F2)' + #10 +
      ' RETURNING ID INTO :o_NewID';
    Parameters.ParamByName('i_F1').Value := 'Hallo';
    Parameters.ParamByName('i_F2').Value := 1;
    Parameters.ParamByName('o_NewID').Direction := pdOutput;
    Prepared := True;

    ExecSQL;

    NewID := Parameters.ParamByName('o_NewID').Value;

  End;


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