AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken ID nicht gefunden nach last_insert_rowid()

ID nicht gefunden nach last_insert_rowid()

Ein Thema von EdAdvokat · begonnen am 13. Mai 2017 · letzter Beitrag vom 16. Mai 2017
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#1

AW: ID nicht gefunden nach last_insert_rowid()

  Alt 14. Mai 2017, 12:36
verstehe ich himitsu richtig, dass die globale Funktion an dieser Stelle entbehrlich wäre und gestrichten werden sollte?
Jupp, diese Funktion liefert die letzte ID, vom letzten INSERT, egal auf welche Tabelle.

Wenn du unbedingt willst, dann kannst du auch gern alle deine Tabellen miteinander JOINen und Millionen Datensätze abrufen, aber es ändert nichts daran, dass diese Funktion global ist und nicht an einer Tabelle hängt.
Es kommt immer das selbe Ergebnis raus ... nur halt mehrfach.
SQL-Code:
SELECT last_insert_rowid() AS ID FROM KONTAKTE JOIN SONSTWAS ON TRUE JOIN NOCHWAS ON TRUE JOIN ...;

SELECT current_user() AS ID FROM KONTAKTE JOIN SONSTWAS ON TRUE JOIN NOCHWAS ON TRUE JOIN ...;

SELECT date('now') AS ID FROM KONTAKTE JOIN SONSTWAS ON TRUE JOIN NOCHWAS ON TRUE JOIN ...;
Zitat:
SELECT * FROM KONTAKTE
Fragt natürlich sinnlos alle Felder der Tabelle ab, obwohl nur das ID-Feld verwendet wird.
SELECT ID FROM KONTAKTE
Aber hier kommen natürlich alle IDs an, und das auch noch in beliebiger Reihenfolge.
Dass zufällig die ID des ersten Datensatzes die richtige ID ist, ist eher unwahrscheinlich.
SELECT ID FROM KONTAKTE ORDER BY ID DESC
So wäre als erster Datensatz schonmal das Richtige, aber es werden natürlich immernoch sinnlos alle anderen Datensätze mit runtergeladen.
SELECT ID FROM KONTAKTE ORDER BY ID DESC LIMIT 1 -- oder SELECT FIRST 1 ID FROM KONTAKTE ORDER BY ID DESC ???

und das schon genannte MAX wäre auch ein guter Weg
SELECT MAX(ID) FROM KONTAKTE

Natürlich funktioniert das alles nur, wenn die IDs aufsteigend sind und es keine Lücken gibt, welche automatisch gefüllt werden,
also nur, wenn die letzte ID auch immer die Größte ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (14. Mai 2017 um 12:42 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: ID nicht gefunden nach last_insert_rowid()

  Alt 14. Mai 2017, 13:01
Himitsu's Vorschlag hat es gebracht:qMain.SQL.Text := 'SELECT ID FROM KONTAKTE ORDER BY ID DESC LIMIT 1'; So wird nach dem Einfügen (INSERT) eines neuen Datensatzes dieser mit exakter ID richtig angezeigt und gespeichert.
Die Variante qMain.SQL.Text := 'SELECT max(ID) as ID from KONTAKTE'; hat nicht geklappt.
Ich habe ein Verständnisproblem: Wir wollten doch die ID des letzten eingefügten DS bekommen. Warum führt da DESC zum Ziel, das doch absteigend sortiert? Was bewirkt LIMIT 1?
Habe zwischenzeitlich auf der SQLite3-Seite gestöbert: https://www.sqlite.org/c3ref/last_insert_rowid.html
Dort sind div. Funktionen aufgeführt die zumeist mit SQLITE3_... beginnen, doch deren Verwendung führt dazu dass Embar. meint, diese Funktionen nicht zu kennen. Wie ist das zu verstehen?

Entschuldigung: habe soeben meinen Denkfehler erkannt: ja wir wollen doch die ID des letzten Datensatzes also muss es rückwärts gehen, also DESC!. Liege ich da richtig? und Limit 1 damit wirklich nur die ID des letzten DS verarbeitet wird?!
Norbert

Geändert von EdAdvokat (14. Mai 2017 um 13:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#3

AW: ID nicht gefunden nach last_insert_rowid()

  Alt 14. Mai 2017, 13:16
Eigentlich müsste MAX aber auch funktionieren.
https://www.sqlite.org/lang_aggfunc.html

Und ja, DEST ist absteigend, also steht der größte Wert oben und der erste Datensatz des Ergebnisses wird ja auch genommen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: ID nicht gefunden nach last_insert_rowid()

  Alt 14. Mai 2017, 13:29
habe Variante: qMain.SQL.Text:='SELECT MAX(ID) FROM KONTAKTE'; erfolglos probiert. Wieder die bekannte Exception, dass er das Feld 'ID' nicht finden könne. Komisch. Sind die SQL Befehle auf der von mir benannten Seite auch in Delphi gültig?
Ich danke Euch für die Hilfe und Unterstützung. Nun werde ich noch das Problem mit der Anzeige aller DS nach Bearbeiten zu lösen versuchen.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#5

AW: ID nicht gefunden nach last_insert_rowid()

  Alt 14. Mai 2017, 13:33
Zitat:
SELECT MAX(ID) FROM KONTAKTE
Ohh ja, da heißt das Feld natürlich 'MAX', also so wie die Funktion, aus der das Ergebnis kommt.
SELECT MAX(ID) AS ID FROM KONTAKTE

Darum gab es auch schon ein paar Vorschläge mit SQL.Fields[0] anstatt SQL.FieldByName('ID') .
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: ID nicht gefunden nach last_insert_rowid()

  Alt 14. Mai 2017, 13:51
Ich schrieb nicht ganz umsonst:SELECT MAX(ID) AS ID FROM KONTAKTE Wenn Du dann SELECT MAX(ID) FROM KONTAKTE nimmst, ist das natürlich was anderes.

Bitte übernimm bei Vorschlägen den ganzen Quelltext und nicht nur irgendwelche Teilmengen. Das kann bei der Fehlersuche deutlich hilfreich sein.

Wenn man MAX(ID) in 'nem SQL hat, dann heißt das nicht zwingend, dass die Spalte im Ergebnis dann auch Max heißt. Bei SQLite und FireBird mag das so sein.
Andere Datenbanken liefern dann auch schonmal Expr_1 oder, je nach Anzahl der verwendeten Funktionen Expr_1 bis Expr_n.

Man sollte bei Funktionen immer ein AS Spaltenname machen, damit man weiß, wie die Spalte im Ergebnis heißen wird.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: ID nicht gefunden nach last_insert_rowid()

  Alt 14. Mai 2017, 14:04
Wenn's ums Lernen geht:

Bezüglich SQL: Einführung in die SQL Grundlagen

Auf der Seite wird auch beschrieben, was es mit dem AS auf sich hat: Daten abfragen

Viel mehr zum Thema: Grundlagen SQL

Bevor man sich da datenbankspezifisch auf die Besonderheiten der einzelnen System "stürzt", lieber erstmal allgemein informieren.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz