Benutzerdefiniertes Auto-Inkrement-Feld in postgresql (Rechnungs- / Bestellnummer)

Die Grundvoraussetzung besteht darin, eine Bestellnummer im folgenden Format zu erstellen:

(M)M-SSS

Wobei MM den aktuellen Monat und SSSS die Reihenfolge für diesen Monat darstellt. Zum Beispiel würde 1-002 die zweite Bestellung darstellen, die im Januar eingereicht wurde.

Verwenden eines TRIGGERS Ich möchte, dass das automatische Inkrementieren und Einfügen transparent funktioniert.

Leider ist es lange her, dass ich eine gespeicherte Prozedur berührt habe, und dies ist mein erster Ausflug in postgresql. Jede Hilfe in die richtige Richtung wäre sehr dankbar.

Update: Hier ist die endgültige Implementierung mit @ peterms Code

-- The trigger
CREATE TRIGGER add_order_number 
   BEFORE INSERT ON orders FOR EACH ROW
   EXECUTE PROCEDURE order_number_update();

-- The trigger function
CREATE FUNCTION order_number_update() RETURNS TRIGGER AS $
DECLARE
    next_order TEXT;
BEGIN
    -- get the next order number
    SELECT INTO next_order CONCAT(CAST(DATE_PART('MONTH', CURRENT_DATE) AS VARCHAR(2)),
       '-', 
       LPAD(CAST(COALESCE(CAST(RIGHT(MAX(order_number), 3) AS INT), 0) + 1 AS VARCHAR(3)), 3, '0'))
    FROM orders
    WHERE CAST(LEFT(order_number, STRPOS(order_number, '-') - 1) AS INT) = DATE_PART('MONTH', CURRENT_DATE);

    -- update the field
    NEW.order_number = next_order;
    RETURN NEW;
END;
$ LANGUAGE plpgsql;

Hinweis: Wenn Sie das Update als BEFORE INSERT-Trigger hinzufügen, funktioniert es auf völlig transparente und vorhersehbare Weise, ähnlich wie es ein normales SERIAL- oder BIGSERIAL-Feld tun würde.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage