PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Sequenz in Zeile INSERT aktualisieren

Das ist eine bekannte Einschränkung:Sequenzen werden während des Aufrufs des <-Codes inkrementiert>nextval() Funktion, die Ihr Standardwert für Ihr Feld ist. Wenn Sie Daten bei INSERT angeben zu diesem Feld wird der Ausdruck des Standardwerts nicht ausgewertet, deshalb wird der Wert der Sequenz nicht berührt.

Eine Problemumgehung besteht darin, einen Trigger vor/nach INSERT einzurichten den Wert der Sequenz manuell mit setval() . Aber so sollten Sie müssen einen Trigger auf UPDATE einrichten auch in diesem Feld, um den Wert der Sequenz zu korrigieren, wenn Sie einfach eine vorhandene ID auf eine höhere ID aktualisieren.

Eine andere Problemumgehung besteht darin, dass Sie eine gespeicherte Funktion schreiben, die einen verfügbaren Wert für dieses Feld erzeugen und den Standardwert Ihres Felds auf den Rückgabewert dieser Funktion setzen kann. Etwas, wie:

LOOP
    result = nextval('my_id_seq');
    EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;

Aber seien Sie gewarnt:Die Standardfunktionalität für Sequenzen ist sicher für gleichzeitige Einfügungen (der aktuelle Status der Sequenz ist global - transaktionsunabhängig). Wenn Sie diesen Feldern explizite Werte zuweisen, ist dies nicht der Fall.