SELECT LAST_INSERT_ID() immer 0
Ich habe ein Problem mit "SELECT LAST_INSERT_ID" es gibt immer 0 zurück egal was ich auch versuche. Hier mal ein Auszug aus dem Quellcode..
public class MyClassDAOImpl extends JdbcDaoSupport implements MyClassDAO{
public int create(Filter filter) {
int id = 0;
if (filter!= null) {
JdbcTemplate template = getJdbcTemplate();
String sql = "INSERT INTO mytable (feld1, feld2, feld3, feld4, feld5, feld6, feld7) VALUES (?,?,?,?,?,?,?)";
template.update(
sql,
new Object[] {
filter.feld1,
filter.feld2,
filter.feld3,
filter.feld4,
filter.feld5,
filter.feld6,
filter.feld7,
}
);
id = template.queryForInt("SELECT LAST_INSERT_ID()");
}
return id;
}
... more CODE....
Wie man sieht handelt es sich hierbei um den Anfang eines CRUDs. Ich habe wie es sich als ordentlicher Programmierer gehört Junit Test dazu geschrieben. Beim Testen der Create Methode wir per assertEquals(1, ..dao.create(fuba)) überprüft ob das objekt auch eingefügt wurde, wenn ja müsste nach meiner Implementation die zu letzt eingefügte ID zurückgegeben werden. Ich arbeite mit Temptables und es ist das erste eingefügte Objekt, weshalb ich auch auf 1 Prüfe. Der Fehler das Last insert id nur dann geht wenn der Prim Key ein Auto Increment ist, kann ausgeschlossen werden. Es ist ein Auto Increment.
So ich bin gern für eure Vorschläge zu haben, ich habe schon 2 Std investiert und das ist eigentlich schon viel zu viel für ein einfaches CRUD.
public class MyClassDAOImpl extends JdbcDaoSupport implements MyClassDAO{
public int create(Filter filter) {
int id = 0;
if (filter!= null) {
JdbcTemplate template = getJdbcTemplate();
String sql = "INSERT INTO mytable (feld1, feld2, feld3, feld4, feld5, feld6, feld7) VALUES (?,?,?,?,?,?,?)";
template.update(
sql,
new Object[] {
filter.feld1,
filter.feld2,
filter.feld3,
filter.feld4,
filter.feld5,
filter.feld6,
filter.feld7,
}
);
id = template.queryForInt("SELECT LAST_INSERT_ID()");
}
return id;
}
... more CODE....
Wie man sieht handelt es sich hierbei um den Anfang eines CRUDs. Ich habe wie es sich als ordentlicher Programmierer gehört Junit Test dazu geschrieben. Beim Testen der Create Methode wir per assertEquals(1, ..dao.create(fuba)) überprüft ob das objekt auch eingefügt wurde, wenn ja müsste nach meiner Implementation die zu letzt eingefügte ID zurückgegeben werden. Ich arbeite mit Temptables und es ist das erste eingefügte Objekt, weshalb ich auch auf 1 Prüfe. Der Fehler das Last insert id nur dann geht wenn der Prim Key ein Auto Increment ist, kann ausgeschlossen werden. Es ist ein Auto Increment.
So ich bin gern für eure Vorschläge zu haben, ich habe schon 2 Std investiert und das ist eigentlich schon viel zu viel für ein einfaches CRUD.
alternativ könntest du eine spalte created_time() erstellen und mit
würdest du den zu letzt erstellten datensatz kriegen..
http://dev.mysql.com/doc/refman/5.1/de/i…-functions.html
wenn du ein auto increment feld in deiner tabelle hast, dann müsste es gehen, wieso es bei dir nicht geht , liegt vielleicht an deiner queryForInt methode. Probier mal mit ganz normalen mysql_query ohne klasse dahinter...
MFG
|
|
MySQL-Abfrage(n) |
1 2 3 4 |
SELECT id FROM tabelle ODER BY created_time DESC LIMIT 1; |
würdest du den zu letzt erstellten datensatz kriegen..
http://dev.mysql.com/doc/refman/5.1/de/i…-functions.html
wenn du ein auto increment feld in deiner tabelle hast, dann müsste es gehen, wieso es bei dir nicht geht , liegt vielleicht an deiner queryForInt methode. Probier mal mit ganz normalen mysql_query ohne klasse dahinter...
MFG
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
Zitat
id = template.queryForInt("SELECT LAST_INSERT_ID()");
las das Select weg dann wird auch funktionieren!
(http://php.net/manual/de/function.mysql-insert-id.php)
|
|
PHP-Quelltext |
1 |
$id = mysql_insert_id();
|
Mfg Splasch
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »splasch« (4. Juli 2011, 13:05)
Erstmal danke für die guten Vorschläge.
@cccpmik, eine zusätzliche Spalte steht nicht auf der Liste der Möglichkeiten, gearbeitet werden muss mit dem was gegeben ist
, liegt nicht an mir ist so. Leider wäre später, da die Tabelle auf mehrere 100.000 Einträge wachsen wird, die Performance vom Sortieren und mit Limit nur eines ausgeben nicht ausreichend.
@splasch, wie lorenz schon richtig erkannt hat ist die Syntax korrekt, es handelt sie um Java Quellcode. Tut mir leid das ich das im Vorfeld nicht erwähnt habe.
@lorenz, die Verbindung ist laut log ein und die selbe, der Gedanke ist mir gestern Abend auf Schacht auch gekommen ;D.
Ich habe jedoch einen neuen Status erreicht. Es muss ein Konfigurationsproblem meiner lokalen Datenbank sein, welche ich zum testen verwende. Denn im Online Betrieb funktioniert es. Sollte ich noch raus finden oder einer von euch, welche Ursachen das haben kann, immer gerne her mit den Informationen.
LG
Tsx
@cccpmik, eine zusätzliche Spalte steht nicht auf der Liste der Möglichkeiten, gearbeitet werden muss mit dem was gegeben ist
, liegt nicht an mir ist so. Leider wäre später, da die Tabelle auf mehrere 100.000 Einträge wachsen wird, die Performance vom Sortieren und mit Limit nur eines ausgeben nicht ausreichend.@splasch, wie lorenz schon richtig erkannt hat ist die Syntax korrekt, es handelt sie um Java Quellcode. Tut mir leid das ich das im Vorfeld nicht erwähnt habe.
@lorenz, die Verbindung ist laut log ein und die selbe, der Gedanke ist mir gestern Abend auf Schacht auch gekommen ;D.
Ich habe jedoch einen neuen Status erreicht. Es muss ein Konfigurationsproblem meiner lokalen Datenbank sein, welche ich zum testen verwende. Denn im Online Betrieb funktioniert es. Sollte ich noch raus finden oder einer von euch, welche Ursachen das haben kann, immer gerne her mit den Informationen.
LG
Tsx
mich würde auch interessieren was die querryForInt-Methode macht ...
oder Du führst etwas genauer aus Was unter welchen Bedingungen was Funktioniert
sonnst gibts hier noch ein paar Beispiele von der mysql seite:
Beispiel 25.9. Abruf von AUTO_INCREMENT-Spaltenwerten mit SELECT LAST_INSERT_ID()
Gruß
Ego
oder Du führst etwas genauer aus Was unter welchen Bedingungen was Funktioniert
sonnst gibts hier noch ein paar Beispiele von der mysql seite:
Beispiel 25.9. Abruf von AUTO_INCREMENT-Spaltenwerten mit SELECT LAST_INSERT_ID()
Gruß
Ego
Das QueryForInt ist dafür zuständig das vom SQL Statement zurückgegebene in ein integer zu "pressen" :=). Wenn es null bekommt gibt es 0 aus. Da ich im Junit Test nach einem Create eine 1 zurückbekommen sollte bei einem eingefügten Objekt, kann ich so mit assertEquals prüfen ob (1,rückgabe vom create(1wird erwartet)) ist.
Ähnliche Themen
-
Datenbanken »-
Hilfe bei Query, welcher Operator?
(15. November 2009, 21:55)
-
PHP »-
Link auslesen in PHP
(21. Februar 2008, 22:31)
-
PHP »-
Insert Rückgabewert bei Autoincrement
(25. Juni 2007, 12:39)
-
PHP »-
Brauche hilfe weiß net was falsch is
(14. Juli 2004, 19:47)
-
Datenbanken »-
mysql select frage
(7. Juli 2004, 12:34)



da wird das sicher nicht gehen