Esta sección describe las funciones para operar en objetos de secuencia, también llamados generadores de secuencia o simplemente secuencias. Los objetos de secuencia son tablas especiales de una sola fila creadas con CREATE SEQUENCE. Los objetos de secuencia se utilizan comúnmente para generar identificadores únicos para las filas de una tabla. Las funciones de secuencia, enumeradas en la tabla 9.50, proporcionan métodos sencillos y seguros para múltiples usuarios para obtener valores de secuencia sucesivos a partir de objetos de secuencia.

Cuadro 9.50. Funciones de secuencia

Función

Descripción

nextval ( regclass ) → bigint

Avanza el objeto de secuencia a su siguiente valor y devuelve ese valor. Esto se hace de forma atómica: incluso si se ejecutan varias sesiones nextval al mismo tiempo, cada uno recibirá de forma segura un valor de secuencia distinto. Si el objeto de secuencia se ha creado con los parámetros predeterminados, sucesivamente nextval las llamadas devolverán valores sucesivos que comiencen con 1. Se pueden obtener otros comportamientos utilizando los parámetros apropiados en el comando CREATE SEQUENCE.

Esta función requiere USAGE o UPDATE privilegio sobre la secuencia.

setval ( regclass, bigint [, boolean ] ) → bigint

Establece el valor actual del objeto de secuencia y, opcionalmente, su is_called bandera. La forma de dos parámetros establece la secuencia last_value campo al valor especificado y establece su is_called campo a true, lo que significa que el próximo nextval avanzará la secuencia antes de devolver un valor. El valor que reportará currval también se establece en el valor especificado. En la forma de tres parámetros, is_called se puede configurar en true o false. true tiene el mismo efecto que la forma de dos parámetros. Si está configurado en false, el siguiente nextval devolverá exactamente el valor especificado, y el avance de la secuencia comienza con lo siguiente nextval. Además, el valor informado por currval no se cambia en este caso. Por ejemplo,

SELECT setval('myseq',42);Next nextval will return43SELECT setval('myseq',42,true);     Same as above
SELECT setval('myseq',42,false);Next nextval will return42

El resultado devuelto por setval es solo el valor de su segundo argumento.

Esta función requiere UPDATE privilegio sobre la secuencia.

currval ( regclass ) → bigint

Devuelve el valor obtenido más recientemente por nextval para esta secuencia en la sesión actual. (Se informa un error si nextval nunca ha sido llamado para esta secuencia en esta sesión.) Debido a que esto devuelve un valor local de sesión, da una respuesta predecible si otras sesiones se han ejecutado o no. nextval desde que lo hizo la sesión actual.

Esta función requiere USAGE o SELECT privilegio sobre la secuencia.

lastval () → bigint

Devuelve el valor devuelto más recientemente por nextval en la sesión actual. Esta función es idéntica a currval, excepto que en lugar de tomar el nombre de la secuencia como argumento, se refiere a cualquier secuencia nextval se aplicó más recientemente en la sesión actual. Es un error llamar lastval si nextval aún no ha sido llamado en la sesión actual.

Esta función requiere USAGE o SELECT privilegio sobre la última secuencia utilizada.

Precaución

Para evitar bloquear transacciones concurrentes que obtienen números de la misma secuencia, un nextval la operación nunca se revierte; es decir, una vez que se ha obtenido un valor, se considera utilizado y no se devolverá de nuevo. Este es true incluso si la transacción circundante se aborta más tarde, o si la consulta que realiza la llamada termina sin usar el valor. Por ejemplo, un INSERT con un ON CONFLICT la cláusula calculará la tupla que se insertará, incluida la realización de cualquier nextval llamadas, antes de detectar cualquier conflicto que pudiera causar que siguiera el ON CONFLICT regla en su lugar. Tales casos dejarán sin usar agujeros en la secuencia de valores asignados. Por lo tanto, los objetos de secuencia de PostgreSQL no se puede utilizar para obtener sin pausas secuencias.

Del mismo modo, cualquier cambio de estado de secuencia realizado por setval no se deshacen si la transacción se revierte.

La secuencia a ser operada por una función de secuencia está especificada por un regclass argumento, que es simplemente el OID de la secuencia en el pg_class catálogo del sistema. Sin embargo, no es necesario buscar el OID a mano, ya que regclass El convertidor de entrada del tipo de datos hará el trabajo por usted. Simplemente escriba el nombre de la secuencia entre comillas simples para que parezca una constante literal. Para compatibilidad con el manejo de nombres SQL ordinarios, el string se convertirá a minúsculas a menos que contenga comillas dobles alrededor del nombre de la secuencia. Por lo tanto:

nextval('foo')      operates on sequence foo
nextval('FOO')      operates on sequence foo
nextval('"Foo"')    operates on sequence Foo

El nombre de la secuencia se puede calificar de esquema si es necesario:

nextval('myschema.foo')     operates on myschema.foo
nextval('"myschema".foo')   same as above
nextval('foo')              searches search path for foo

Consulte la Sección 8.19 para obtener más información sobre regclass.

Nota

Antes de PostgreSQL 8.1, los argumentos de las funciones de secuencia eran de tipo text, no regclass, y la conversión descrita anteriormente de un texto string a un valor de OID sucedería en tiempo de ejecución durante cada llamada. Para compatibilidad con versiones anteriores, esta facilidad todavía existe, pero internamente ahora se maneja como una coerción implícita de text para regclass antes de que se invoque la función.

Cuando escribe el argumento de una función de secuencia como un literal sin adornos string, se convierte en una constante de tipo regclass. Dado que esto es realmente solo un OID, rastreará la secuencia identificada originalmente a pesar del cambio de nombre posterior, la reasignación de esquema, etc. encuadernación anticipada El comportamiento suele ser deseable para referencias de secuencia en vistas y valores predeterminados de columna. Pero a veces es posible que quieras encuadernación tardía donde la referencia de secuencia se resuelve en tiempo de ejecución. Para obtener un comportamiento de enlace tardío, fuerce la constante para que se almacene como un text constante en lugar de regclass:

nextval('foo'::text)      foo is looked up at runtime

Tenga en cuenta que el enlace tardío era el único comportamiento admitido en las versiones de PostgreSQL anteriores a 8.1, por lo que es posible que deba hacer esto para preservar la semántica de las aplicaciones antiguas.

Por supuesto, el argumento de una función de secuencia puede ser tanto una expresión como una constante. Si es una expresión de texto, la coerción implícita dará como resultado una búsqueda en tiempo de ejecución.

Anterior Hasta próximo
9.16. Funciones y operadores JSON Hogar 9.18. Expresiones condicionales