Това е известно ограничение:последователностите се увеличават по време на извикването на nextval()
функция, която е вашата стойност по подразбиране на вашето поле. Когато предоставяте данни на INSERT
към това поле, изразът на стойността по подразбиране не се оценява, затова стойността на последователността не се докосва.
Заобиколно решение е да настроите тригер преди/след INSERT
за ръчно коригиране на стойността на последователността с setval()код>
. Но по този начин трябва трябва да настроите тригер на UPDATE
в това поле също, за да коригирате стойността на последователността, когато просто актуализирате някои съществуващи id до по-висок id.
Друго заобиколно решение е да напишете съхранена функция, която може да произведе налична стойност за това поле и да зададе стойността по подразбиране на вашето поле на върнатата стойност на тази функция. Нещо като:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Но бъдете предупредени:функционалността по подразбиране за последователности е безопасна за едновременни вмъквания (текущото състояние на последователността е глобално - независимо от транзакцията). Ако предоставите изрични стойности на тези полета, това няма да е така.