sqlite: subselect MAX() in Update Statement
-
Servus,
update tblX set lid = (select MAX(lid)+1 FROM tblX) where tblX.ROWID=74
Ergebnis in der Zeile 74 steht immer die bisher größte lid PLUS 2
lid (t+0) : 0
lid (t+1) : 2
lid (t+1) : 4Ich weiß nur nicht warum das so ist
Das ganze soll in ein Insert-Trigger. Autoincrement kann für die lid-Spalte
nicht verwendet werden, da nur der PRIMARY KEY das Attribut Autoincrement haben
darf und dieser soll es gerade nicht haben. PK ist ein zusammengesetzter Key
aus anderen Spalten.
-
Welche DB verwendest du? Würde mich wundern wenn die Auto-Increment Spalte Teil des PK sein müsste. Nen (vermutlich unique) Index muss sie natürlich haben. Vielleicht ist einfach nur deine CREATE TABLE Syntax falsch?
Ansonsten...
Bin mir nicht ganz sicher was du da machen willst.
Aber vielleicht erreichst du mitUPDATE tblX SET lid = (SELECT MAX(lid)+1 FROM tblX WHERE tblX.ROWID<>74) WHERE tblX.ROWID=74
was du willst?
Ich würde dir aber wirklich empfehlen zu versuchen den Trigger zu vermeiden. Trigger sind nicht unbedingt schnell. Und Trigger gehören auch zu den Teilen an die man immer als letztes denkt wenns irgendwo ein Problem gibt. Nicht aber zu den Teilen die dann am seltensten schuld sind.
-
danke,
ich verwende sqlite. http://www.sqlite.org/faq.html#q1
autoincrement kann nur in Verbindung mit PRIMARY KEY verwendet werden
Natürlich kann ich auch Trigger vermeiden, es würde nur den Programmcode
verkürzen und ich erhoffe mir potentielle Fehlerquellen dabei auszuschließen.Das Beispiel aus obigen Link:
INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);
umgesetzt
INSERT INTO t1 (col1) VALUES((SELECT max(col1) FROM t1)+1);
erzeugt zwei Zeilen in der Tabelle
Trigger sind nicht schnell, sowas hab ich mir schon gedacht. Die Alternative ist
aber Java-Code, es handelt sich um ein Android-Projekt.Ich versuche mit last_insert_rowid() weiter zu kommen.
-
RED-BARON schrieb:
Das Beispiel aus obigen Link:
INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);
umgesetzt
INSERT INTO t1 (col1) VALUES((SELECT max(col1) FROM t1)+1);
erzeugt zwei Zeilen in der Tabelle
Tut es sicher nicht.
Ein INSERT kann dir nicht zwei Zeilen einfügen.
Versuch das mal auf ner neuen Tabelle -- vielleicht funkt dein Trigger hier schon wieder dazwischen.
-
ich wird noch doof,
natürlich sollte es das nicht. Ich verwende die zugegeben etwas alte Version
von http://www.exedllsys.com/s/sqlitecc.exe.html und mit der ist es so. Bug
Ein Trigger ist auf der Tabelle nicht registriert. Es werden ganz sicher
2 Zeilen mit INSERT INTO info (lid) VALUES((SELECT max(lid) FROM info)+1);
eingefügt.CREATE TABLE info(lid INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (lid))
-
Schonmal mit ner aktuellen SQLite Version versucht?
Oder musst du genau diese Version verwenden?
-
wird ich alsbald testen. jedes Android Gerät
hat eine neuerer Version als dieses ToolMit sqlite 3.7.7.1 wird auch nur ein DS eingefügt.
MUss wohl dann ein Bug in der Uralt-Version sein