To znane ograniczenie:sekwencje są zwiększane podczas wywoływania kodu <>nextval()
funkcja, która jest twoją domyślną wartością twojego pola. Kiedy dostarczasz dane w INSERT
do tego pola, wyrażenie wartości domyślnej nie jest oceniane, dlatego wartość sekwencji nie jest dotykana.
Rozwiązaniem jest ustawienie wyzwalacza przed/po INSERT
ręcznie naprawić wartość sekwencji za pomocą setval()
. Ale w ten sposób powinieneś trzeba skonfigurować wyzwalacz UPDATE
również w tym polu, aby naprawić wartość sekwencji, po prostu aktualizując istniejący identyfikator do wyższego identyfikatora.
Innym obejściem jest napisanie przechowywanej funkcji, która może wygenerować dostępną wartość dla tego pola i ustawić domyślną wartość pola na wartość zwracaną przez tę funkcję. Coś takiego jak:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Ale uwaga:domyślna funkcjonalność sekwencji jest bezpieczna dla współbieżnych wstawiania (aktualny stan sekwencji jest globalny - niezależny od transakcji). Jeśli podasz jawne wartości do tych pól, tak nie będzie.