Esa es una limitación conocida:las secuencias se incrementan durante la llamada del nextval()
función, que es el valor predeterminado de su campo. Cuando proporciona datos en INSERT
a ese campo, la expresión del valor por defecto no evalúa, por eso no se toca el valor de la secuencia.
Una solución es configurar un disparador antes/después de INSERT
para arreglar manualmente el valor de la secuencia con setval()
. Pero de esta manera debería necesita configurar un disparador en UPDATE
en ese campo también, para corregir el valor de la secuencia, cuando solo actualiza una identificación existente a una identificación más alta.
Otra solución es escribir una función almacenada, que puede producir un valor disponible para ese campo y establecer el valor predeterminado de su campo en el valor de retorno de esa función. Algo, como:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Pero tenga cuidado:la funcionalidad predeterminada para secuencias es segura para inserciones simultáneas (el estado actual de la secuencia es global, independiente de la transacción). Si proporciona valores explícitos a esos campos, ese no será el caso.