[gelöst]AutoIncrement-Wert beim INSERT ermitteln(geht das?)

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: AutoIncrement-Wert beim INSERT ermitteln(geht das?)

Beitrag von hde »

Patito hat geschrieben:Bei Datenbanken ist jenseits von "SELECT * FROM Table" Schluß mit der Kompatibilität und spätestens wenn man Inserts
macht ist der Spass mit der Portabilität vorbei.
selbst wenn nur ein "where" dazukommt gibt's schon Unterschiede. Bei einigen kann man generell "like" nehmen, bei anderen nur dann wenn auch ein Joker vorkommt.

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: AutoIncrement-Wert beim INSERT ermitteln(geht das?)

Beitrag von hubblec4 »

Ich hatte den befehl
LAST_INSERT_ID()
mal probiert, aber da bekomme ich eine "1" als rückgabewert.
das stimmt aber nicht mit dem autoincrementwert überein.

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: AutoIncrement-Wert beim INSERT ermitteln(geht das?)

Beitrag von Patito »

hubblec4 hat geschrieben:Ich hatte den befehl
LAST_INSERT_ID()
mal probiert, aber da bekomme ich eine "1" als rückgabewert.
das stimmt aber nicht mit dem autoincrementwert überein.
Sollte er aber...

Machst Du den SELECT LAST_INSERT_ID() über dieselbe Connection?
Gibt es mehr als ein Autoincrement-Feld?

Beim Insert sollte der Insert-Wert auch wirklich über das Autoincrement gekommen sein. Wenn man selbst beim Insert einen
Wert angibt (SELECT Max ...), geht das normalerweise am Autoincrement-Mechanismus vorbei.

Trigger bringen in manchen Datenbanken ebenfalls den Mechanismus durcheinander, aber bei MySQL sollte es eigentlich funktionieren.

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: AutoIncrement-Wert beim INSERT ermitteln(geht das?)

Beitrag von hubblec4 »

ich hatte heute etwas hilfe von einem freund.

das mit dem LAST_INSERT_ID() funktioniert soweit recht gut.

ich gebe mir den wert in eine variable aus

SET @last_id = LAST_INSERT_ID();

und kann dann alle anderen records mit dem @last_id wert befüllen.

jetzt möchte ich noch in einer anderen tabelle die last_id als text ablegen. daran hängst noch gerade etwas.

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: AutoIncrement-Wert beim INSERT ermitteln(geht das?)

Beitrag von hubblec4 »

Um das ganze abzuschliessen würde ich noch kurz erwähnen wollen das man mit der normalen SQLQuery-Komponente nicht weit kommt.

Damit das ganze funktioniert benötigt man
TSQLScript

somit kann man dann mehrere SQL-Befehle aufeinmal abfeuern.

Hatte da gestern lange gesucht bis ich im netz ein thema mit zwei beträgen gefunden hatte.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: [gelöst]AutoIncrement-Wert beim INSERT ermitteln(geht da

Beitrag von mse »

Funktioniert denn TMySQL51Connection.GetInsertID() nicht?

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: [gelöst]AutoIncrement-Wert beim INSERT ermitteln(geht da

Beitrag von hubblec4 »

mse hat geschrieben:Funktioniert denn TMySQL51Connection.GetInsertID() nicht?
für die Connection nutze ich nicht direkt eine TMySQLConnection-Komponente. Ich nehme immer den TSQLConnoctor wo man dann nach belieben die MYSQL connection einstellen kann, je nach dem was für eine MySQL Datenbank vorhaden ist.

beim TSQLConnector gibt es diese funktion GetInsertID() leider nicht.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: [gelöst]AutoIncrement-Wert beim INSERT ermitteln(geht da

Beitrag von mse »

Hmm. Die MSEgui Ausführung von tmysqlconnection läuft mit allen Versionen ab 5.0.
Hinter TSQLConnector.Proxy steckt die eigentliche connection Komponente. Man könnte doch die gemeinsamen Teile der verschiedenen tmysqlconnections in eine Grundklasse vereinen und dann mit tmysqlconnection(proxy) darauf zugreifen? Oder mache in TSQLConnection eine "GetInsertID() virtual; abstract;" welche in den MySQL connections überschrieben wird. In MSEgui gibt es eine getinsertid() Funktion in tcustomsqlconnection welche eine exception wirft wenn die spezifische Datenbank die Funktion nicht unterstützt. Aber wie bereits erwähnt, normalerweise braucht man das nicht, da die Werte automatisch in die Felder zurückgeschrieben werden.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: [gelöst]AutoIncrement-Wert beim INSERT ermitteln(geht da

Beitrag von mse »

Eine weitere Möglichkeit wäre etwa so:

Code: Alles auswählen

 
type
 tsqlconnector1 = class(tsqlconnector);
 
function getinsertid(const conn: tsqlconnector): int64;
begin
 with tsqlconnector1(conn) do begin
  checkproxy();
  if proxy is tmysql56connection then begin
   result:= tmysql56connection(proxy).getinsertid();
  end
  else begin
   if proxy is tmysql55connection then begin
    result:= tmysql55connection(proxy).getinsertid();
   end
   else begin
    if proxy is tmysql51connection then begin
     result:= tmysql51connection(proxy).getinsertid();
    end
    else begin
     if proxy is tmysql50connection then begin
      result:= tmysql50connection(proxy).getinsertid();
     end
     else begin
      raise exception.create(conn.name+': getinsertid() not supported');
     end;
    end;
   end;
  end;
 end;
end;
 

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: [gelöst]AutoIncrement-Wert beim INSERT ermitteln(geht da

Beitrag von hubblec4 »

ok sieht auch sehr gut aus.
danke für den code.

Antworten