Tworze pewna baze danych z tabela przechowujaca uzytkownikow oraz uslugi, ktore ci uzytkownicy beda posiadac. Problem jest w tym, ze tych uslug bedzie wiele, tysiace dla kazdego uzytkownika, ktory bedzie je sobie mogl dodawac i usuwac.
Chce, aby uzytkownikowi numeracja uslug leciala od poczatku np. usluga#1, usluga#2 a nie jak w przypadku nextval() usluga#2831381.
Napisalem prosta funkcje w plpgsql:
CREATE OR REPLACE FUNCTION nextdbid(users_id integer) RETURNS integer AS $BODY$ DECLARE last_id integer; BEGIN SELECT db.id INTO last_id FROM db WHERE db.users_id=users_id ORDER BY id DESC LIMIT 1 ; IF NOT FOUND THEN RETURN 1; END IF; RETURN last_id+1; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION nextdbid(integer) OWNER TO "admin";
i teoretycznie dziala, jednak przy dodawaniu rekordu musze wklepywac:
INSERT INTO db VALUES (nextdbid(2), 2); -- itd.
rozumiem, ze nie da sie zrobic czegos w stylu:
CREATE TABLE db ( id INTEGER NOT NULL DEFAULT (nextdbid(users_id)), -- itd. );

Oprocz tego funkcja ta nie dziala dokladnie tak samo jak nextval gdyz podaje wartosc ostatniego id powiekszona o jeden, nie uwzgledniajac czy uzytkownik mial juz jakies uslugi i je wykasowal (po zwolnieniu sie identyfikatorow nie powinny one byc brane pod uwage).
Czy ktos ma jakies lepsze rozwiazanie tego problemu?
Pozdrawiam