Niestandardowe pole automatycznego przyrostu w postgresql (nr faktury / zamówienia)

Podstawowym wymaganiem jest utworzenie numeru zamówienia w formacie:

(M)M-SSS

Gdzie MM oznacza bieżący miesiąc, a SSSS reprezentuje sekwencję zleceń dla tego miesiąca. Na przykład 1-002 reprezentowałoby drugie zamówienie złożone w styczniu.

Używanie TRIGGER Chciałbym, aby auto-increment i insert działały w sposób przejrzysty.

Niestety, minęło dużo czasu, odkąd dotknąłem procedury zapisanej w bazie i jest to mój pierwszy atak na postgresql. Każda pomoc skierowana we właściwym kierunku byłaby bardzo mile widziana.

Aktualizacja: Oto ostateczna implementacja wykorzystująca kod @ peterm

-- 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;

Uwaga: Dodając aktualizację jako wyzwalacz BEFORE INSERT, działa ona w całkowicie przejrzysty i przewidywalny sposób, podobnie jak normalne pole SERIAL lub BIGSERIAL.

questionAnswers(1)

yourAnswerToTheQuestion