Search Postgresql Archives

Re: Invoice increment

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 26/02/2020 09:38, Søren Frisk wrote:
> Hi all
> 
> I'm trying to find a way to increment an invoice number. And i think it
> would be pretty straight forward just using a SERIAL int. But as we're
> selling across multiple countries, i need the invoice increment to be reset
> by a country_id. any good way to achieve this in a dynamic way?

A serial column is absolutely not a good fit for invoice numbers because
in some (most? all?) countries, the numbers are not allowed to have gaps.

The way I would do it is have an invoice_numbers table like this:

CREATE TABLE invoice_numbers (
    country text PRIMARY KEY REFERENCES countries,
    invoice_number bigint NOT NULL
);

And then you can get the next number with something like this:

WITH
u (invoice_number) AS (
    UPDATE invoice_numbers
    SET invoice_number = invoice_number + 1
    WHERE country = $1
    RETURNING invoice_number
),
i (invoice_number) AS (
    INSERT INTO invoice_numbers (country, invoice_number)
    SELECT $1, 1
    WHERE NOT EXISTS (TABLE u)
    ON CONFLICT (country) DO
        UPDATE SET invoice_number = invoice_numbers.invoice_number + 1
    RETURNING invoice_number
)
TABLE u UNION ALL TABLE i;

You can just put that in an SQL function for convenience.

> Hope this is the right place to ask.

Yes, it is.
-- 
Vik Fearing





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux