Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi last_insert_id() funzt nicht.. (https://www.delphipraxis.net/91327-last_insert_id-funzt-nicht.html)

bl3nder 3. Mai 2007 13:34

Datenbank: mysql • Version: 5 • Zugriff über: zeos

last_insert_id() funzt nicht..
 
Hi,

Ich hab folgendes Problem:
Zunächst lege ich eine Testtabelle in meinem Schema "hwpool" an :

SQL-Code:
CREATE TABLE `hwpool`.`test` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `TEST` VARCHAR(45) NOT NULL DEFAULT '',
  PRIMARY KEY(`ID`)
)
ENGINE = InnoDB;
Danach fuege ich einen Datensatz ein :

SQL-Code:
INSERT INTO hwpool.test (`test`) VALUES ('bla')
Nun schau ich nach, ob der Datensatz in der Tabelle test angelegt wurde. Er wurde angelegt und die ID des Datensatzes ist 1

Nun moechte ich durch last_insert_id() herausfinden, was meine zuletzt eingefuegte ID war.

SQL-Code:
SELECT last_insert_id()
Als Rueckgabe bekomme ich nun aber die 0, statt der 1, obwohl ich doch grade eben erst einen Datensatz eingefuegt habe, und der autoincrement Wert dort auf 1 gestiegen ist.

Woran koennte es liegen ?

mkinzler 3. Mai 2007 13:36

Re: last_insert_id() funzt nicht..
 
Welche Version von MySQL (1.1.20 kenn ich nicht) welche Storage-Engine? Ggf Transaktion committen

bl3nder 3. Mai 2007 13:44

Re: last_insert_id() funzt nicht..
 
Hm Fehler von mir..

Vom Server:
5.0.4-beta-nt (via TCP/IP)

Vom Client:
5.0.11

Was meinst du mit Transaktion commiten ?

mkinzler 3. Mai 2007 13:56

Re: last_insert_id() funzt nicht..
 
Ich kenne mich in MySQL im Detail nicht mehr so aus, aber es gibt bestimmte Storage Engines, welche Transaktion ermöglichen. Diese kann man am Stück zurückfahren (rollback) bzw. abschließen (commit).

bl3nder 3. Mai 2007 14:01

Re: last_insert_id() funzt nicht..
 
Ja aber meine Transaktion (also das Insert) ist doch abgeschlossen...
Im Query steht ja auch "1 Row affected by the last command..."

Im Referenzbuch steht :

Zitat:

LAST_INSERT_ID(), LAST_INSERT_ID(expr)

Gibt den ersten automatisch erzeugten Wert zurück, der für eine AUTO_INCREMENT-Spalte durch die aktuelle INSERT- oder UPDATE-Anweisung eingestellt wurde, die eine solche Spalte modifiziert hat.

Wobei auch gilt :

Zitat:

Der Wert von LAST_INSERT_ID() wird nicht geändert, wenn Sie die AUTO_INCREMENT-Spalte eines Datensatzes auf einen „nichtmagischen“ Wert (d. h. einen Wert, der nicht NULL und nicht 0 ist) setzen.

wobei das auch in meiner obigen Testtabelle gewährleistet ist.

:gruebel:

mkinzler 3. Mai 2007 14:10

Re: last_insert_id() funzt nicht..
 
Eine Transaktion kann aber aus mehreren Statements bestehen.

bl3nder 3. Mai 2007 14:19

Re: last_insert_id() funzt nicht..
 
Wie würde sich sowas auf mein Problem auswirken bzw. was würdest du anstattdessen schreiben ?

Schreibe ich bspw.
SQL-Code:
start transaction;
INSERT INTO hwpool.test (`test`) VALUES ('blaaa');
commit;
SELECT * FROM test t;
Verändert sich nichts an der Tabelle test...

Memo 3. Mai 2007 16:03

Re: last_insert_id() funzt nicht..
 
Du hast zwar geschrieben, das Du mit Zeos auf die DB zugreifst, aber kann es sein, das Du Deine Statements mit einem MySQL-Admintool abschickst?

Last_insert_id funktioniert soweit ich mich erinnere nur innerhalb einer Session. Wenn Du also ein Insert absetzt, gugst ob es geklappt hat und dann erst die Id abfragst (in einer neuen Session)bekommst Du Null.
In einer Mehrbenutzerumgebung wird damit gewährleistet, dass man die Id seines eigenen zuletzt eingefügten Satzes bekommt und nicht die von einem anderen Users erhält.
Einfach hier eingetippt, also ungestestet:
Delphi-Quellcode:
Query1.Sql.Text := 'INSERT INTO hwpool.test (test) VALUES '+QuotedStr('bla') ';
Query1.Execute; //oder wie es bei Zeos heisst
Query1.Sql.Text := 'Select Last_Insert_Id() from test';
Query1.Open;
ShowMessage(Query.Fields[0].AsString);
Wenn du nur den grössten Wert brauchst nimm: Max(ID)


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