UPDATE Anweisung für mehrere Einträge automatisch inkrementieren
-
Hi,
in meiner Tabelle können Einträge mit der ID 0 stehen. Diese Einträge, und nur diese, möchte ich ich mit einer ID versehen, die automatisch aufsteigt. In etwa so:
UPDATE TblA SET ID = (SELECT MAX(ID)+1 FROM TblA WHERE ID=0) WHERE ID = 0
Das würde aber dazu führen, dass alle Einträge die gleiche ID bekommen. Existieren aber mehere Einträge, soll die ID für jeden wiederum neu berechnet werden. Wie stell ich das an?
-
UPDATE TblA SET ID = (SELECT MAX(ID)+1 FROM TblA WHERE ID=0) WHERE ID = 0
austauschen mit
UPDATE TblA SET ID = (SELECT MAX(ID)+1 FROM TblA) WHERE ID = 0
Hab's aber nicht getestet. Jedenfalls hattest du den Fehler drinnen, dass immer die ID 1 rauskommt, da nur die Datensätze mit der ID 0 abgefragt werden
-
Oh, ja den Fehler hat ich tatsächlich drin, löst aber das Problem nicht.
Wenn meine Tabelle so aussieht ...A | B --+-- 1 | 1 2 | 2 3 | 3 4 | 4 0 | 5 0 | 6 0 | 7 0 | 8
... und ich wende das darauf an ...
UPDATE TblA SET A = (SELECT MAX(A)+1 FROM TblA) WHERE A = 0
... dann kommt das dabei raus:
A | B --+-- 1 | 1 2 | 2 3 | 3 4 | 4 5 | 5 5 | 6 5 | 7 5 | 8
Haben möchte ich aber folgendes:
A | B --+-- 1 | 1 2 | 2 3 | 3 4 | 4 5 | 5 6 | 6 7 | 7 8 | 8
-
Hmm,
da ergeben sich für mich zwei Möglichkeiten:
1. Ein temporärer Trigger, der bei einem Update-Befehl den Index setzt.CREATE TRIGGER update_tbla_id UPDATE OF tbla ON A BEGIN UPDATE TblA SET A = (SELECT MAX(A)+1 FROM TblA) WHERE B = new.B; END;
Ungefähr so, müsstest halt an deine SQL-Engine anpassen.
2. Du erstellst eine temporäre procedure, die einfach alle Datensätze mit A = 0 durchgeht und reindiziert (foreach Schleife).foreach cs_aidx for SELECT A, B FROM TblA WHERE A = 0 into l_a, l_b FROM TblA update TblA set A = (SELECT MAX(A)+1 FROM TblA) where B = l_B; end foreach;
Ich hoffe das hilft dir erstmal weiter