ID bei neuem Datensatz herausfinden
-
Hallo!
Ich füge mit dem SQL Befehl INSERT INTO einen neuen Datensatz ein.
Eine ID Nummer(in einem Identity Feld oder sö ähnlich...) wird dabei automatisch von der Datenbank zum Datensatz erzeugt.
Nun möchte ich aber gleich erfragen welche ID der Datensatz bekommen hat.
Wie kann ich jetzt möglichst simpel herausfinden, welche ID dem Datensatz zugeteilt wurde?
-
mit welcher Datenbank arbeitest du denn?
was genau ist das für ein ID-Feld (autoincrement, uniqueidentifier)? genauer: stehen Zahlen oder Zeichengruppen drin?für jede Datenbank gibt es verschiedene Syntax, aber bei einem Autoinkrement-Feld geht auch:
select max(id) from tabelle
natürlich nur, wenn nicht grad noch irgendwer einen datensatz in die Tabelle geschrieben hat ...
-
perfekt, das wars!
(hab ein autoinkrement feld mit zahlenwerten in einer sql db gehabt.)
-
und wie stellst du sicher das zwischendrin kein anderer datensatz eingefügt wird?
-
In der Regel ist die präsentierte "select max"-Variante die mit Abstand schlechteste Lösung (wie schon hmmmmmmmm andeutet). Welche Datenbank setzt du ein?
(Und sql db reicht hierbei nicht als Antwort)
-
Nimm nen Trigger.
-
Ich kenne es jetzt nur von MySQL und MSSQL.
Beide haben interne Funktionen um die LASTID zurückzugeben.Bei MYSQL gibt es eine Funktion und bei MSSQL muss man einen Query auf die gleiche Verbindung absetzen.
MySQL:
SELECT LAST_INSERT_ID();MSSQL
SELECT @@IDENTITY as fileId
-
weiß zufällig auch jmd, wie ich eine neue ID bei SQLite3 ermitteln kann?
soweit ich weiß, kennt SQLite keine Autowerte,
weshalb mein Ansatz bisher wäre:ID als normaler INTEGER und per schleife alle vergebenen IDs abfragen...
davon die größte durch vergleichen ermitteln und speichern
diese dann um 1 erhöhen und fertig ist die neue ID für den neuen Datensatz.ich frage mich nur, ob es nur über solche Workarounds geht,
oder ob SQLite vllt doch eigene Methoden für sowas bietet.MfG DrakoXP
-
Doch, SQLite kennt auch Autoincrement:
http://www.sqlite.org/syntaxdiagrams.html#column-constraint
-
thx, aber ich blick da iwie nicht so richtig durch xD
also wenn ich jetzt ein INSERT query losschicke, wie sorge ich dafür, dass der Datensatz eine Auto-ID zugewiesen bekommt.
wie gesagt, verwende ich als Typ INTEGERVerweis auf Doku wegen den verfügbaren Datentypen:
#define SQLITE_INTEGER 1 #define SQLITE_FLOAT 2 #define SQLITE_BLOB 4 #define SQLITE_NULL 5 #ifdef SQLITE_TEXT # undef SQLITE_TEXT #else # define SQLITE_TEXT 3 #endif #define SQLITE3_TEXT 3
also müsste ich bei INSERT sowas machen:
INSERT INTO FooTable (ID, ...) VALUES (n, ...)
meinen Ansatz um n zu ermitteln hab ich ja schon erwähnt,
aber da es scheinbar auch anders geht, wäre es nett, wenn du mir das erklären könntest,
weil ich blick im mom nich so ganz durch xDdanke
MfG DrakoXP
EDIT:
bin gerade auf etwas gestoßen..., wenn der Typ INTEGER PRIMARY KEY ist,
kann ich dann evtl. beim INSERT Statement die ID einfach weglassen und die bekommt so einen automatischen Wert zugewiesen?EDIT:
hat sich erledigt, wenn der Typ INTEGER PRIMARY KEY ist, kann ich den key beim INSERT statement weglassen und es wird ein automatischer Wert vergeben.
thx nochmal für den Denkanstoß :p
-
Unix-Tom schrieb:
MSSQL
SELECT @@IDENTITY as fileIdBei MSSQL ist meist SCOPE_IDENTITY() die bessere Wahl.
Sonst kann man nämlich erst wieder Probleme mit Triggern bekommen.
Weitere Info:
http://msdn.microsoft.com/en-us/library/ms190315.aspx