sql >> Base de Datos >  >> RDS >> PostgreSQL

Secuencia de actualización en la fila INSERTAR

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.