AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi last_insert_id() funzt nicht..
Thema durchsuchen
Ansicht
Themen-Optionen

last_insert_id() funzt nicht..

Ein Thema von bl3nder · begonnen am 3. Mai 2007 · letzter Beitrag vom 3. Mai 2007
Antwort Antwort
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#1

last_insert_id() funzt nicht..

  Alt 3. Mai 2007, 13:34
Datenbank: mysql • Version: 5 • Zugriff über: zeos
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 :

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.

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 ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: last_insert_id() funzt nicht..

  Alt 3. Mai 2007, 13:36
Welche Version von MySQL (1.1.20 kenn ich nicht) welche Storage-Engine? Ggf Transaktion committen
Markus Kinzler
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#3

Re: last_insert_id() funzt nicht..

  Alt 3. Mai 2007, 13:44
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 ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: last_insert_id() funzt nicht..

  Alt 3. Mai 2007, 13:56
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).
Markus Kinzler
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#5

Re: last_insert_id() funzt nicht..

  Alt 3. Mai 2007, 14:01
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.

  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: last_insert_id() funzt nicht..

  Alt 3. Mai 2007, 14:10
Eine Transaktion kann aber aus mehreren Statements bestehen.
Markus Kinzler
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#7

Re: last_insert_id() funzt nicht..

  Alt 3. Mai 2007, 14:19
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...
  Mit Zitat antworten Zitat
Benutzerbild von Memo
Memo

Registriert seit: 19. Aug 2003
509 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: last_insert_id() funzt nicht..

  Alt 3. Mai 2007, 16:03
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)
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:46 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