update start setval secuencia postgres ejemplo create actualizar postgresql select nextval

start - postgresql update sequence setval



Seleccionar mĂșltiples IDs de una secuencia de PostgreSQL (5)

¿Hay una forma concisa de seleccionar el siguiente valor para una secuencia PostgreSQL varias veces en una consulta? Este sería el único valor que se devuelve.

Por ejemplo, me gustaría hacer algo realmente corto y dulce como:

SELECT NEXTVAL(''mytable_seq'', 3) AS id;

Y obten:

id ----- 118 119 120 (3 rows)


A menos que realmente desee que se devuelvan tres filas, establecería la secuencia en ''AUMENTO POR 3'' para cada selección. Luego, puede simplemente agregar 1 y 2 para que el resultado tenga sus tres números de secuencia.

Intenté agregar un enlace a los documentos de postgresql, pero aparentemente no tengo permiso para publicar enlaces.


Hay un gran artículo sobre este problema exacto: " obtener valores múltiples de secuencias ".

Si el rendimiento no es un problema, por ejemplo, cuando se utilizan valores de secuencia, el tiempo utilizado para obtenerlos o n es pequeño, entonces el enfoque SELECCIONAR el siguiente valor (''seq'') FROM generate_series (1, n) es el más simple y apropiado.

Pero cuando se preparan datos para cargas masivas, el último enfoque del artículo de incrementar la secuencia en n desde un bloqueo es apropiado.


Mi mejor solución actual es:

SELECT NEXTVAL(''mytable_seq'') AS id UNION ALL SELECT NEXTVAL(''mytable_seq'') AS id UNION ALL SELECT NEXTVAL(''mytable_seq'') AS id;

Lo que devolverá correctamente 3 filas ... pero me gustaría algo que sea un mínimo de SQL para hasta 100 o más invocaciones NEXTVAL.


select nextval(''mytable_seq'') from generate_series(1,3);

generate_series es una función que devuelve muchas filas con números secuenciales, configuradas por sus argumentos.

En el ejemplo anterior, no nos importa el valor en cada fila, solo usamos genera_series como generador de filas. Y para cada fila podemos llamar a nextval. En este caso devuelve 3 números (nextvals).

Puede incluir esto en función, pero no estoy seguro de si es realmente sensato dado lo corta que es la consulta.


CREATE OR REPLACE FUNCTION foo() RETURNS SETOF INT AS $$ DECLARE seqval int; x int; BEGIN x := 0; WHILE x < 100 LOOP SELECT into seqval nextval(''f_id_seq''); RETURN NEXT seqval; x := x+1; END LOOP; RETURN; END; $$ LANGUAGE plpgsql STRICT;

Por supuesto, si todo lo que intentas hacer es avanzar en la secuencia, hay setval() .

También podría hacer que la función tome un parámetro para cuántas veces hacer un bucle:

CREATE OR REPLACE FUNCTION foo(loopcnt int) RETURNS SETOF INT AS $$ DECLARE seqval int; x int; BEGIN x := 0; WHILE x < loopcnt LOOP SELECT into seqval nextval(''f_id_seq''); RETURN NEXT seqval;x := x+1; END LOOP; RETURN; END; $$ LANGUAGE plpgsql STRICT;