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 💡


Anmelden zum Antworten