Say I have table:
CREATE TABLE custom_sequence (
name TEXT NOT NULL,
number INTEGER DEFAULT NULL,
is_expired BOOLEAN DEFAULT FALSE
);
And on insert I have to find first expired number and put it in new record.
For example:
"a" 1 FALSE "b" 2 TRUE "c" 3 FALSE
insert new:
"c" 2 FALSE
I can do that using TRIGGER:
CREATE OR REPLACE FUNCTION write_custom_number()
RETURNS TRIGGER AS
$$
DECLARE
next_number INTEGER;
BEGIN
SELECT
CASE
WHEN count(*) > 0 THEN min(number)
WHEN count(*) = 0 THEN
CASE
WHEN (SELECT
count(*)
FROM custom_sequence) > 0
THEN (SELECT
count(*)
FROM custom_sequence) + 1
WHEN (SELECT
count(*)
FROM custom_sequence) = 0
THEN
1
END
END
INTO next_number
FROM custom_sequence
WHERE is_expired = TRUE;
IF next_number IS NULL
THEN
next_number = 1;
END IF;
NEW.number := next_number;
RETURN NEW;
END
$$
LANGUAGE plpgsql;
CREATE TRIGGER write_custom_number
BEFORE INSERT ON custom_sequence FOR EACH ROW
EXECUTE PROCEDURE write_custom_number();
But then I'll need to lock table for every INSERT! Is there any better way to solve this problem?