2010-01-07 10 views
30

Mi pregunta es algo simple.Postgresql - El uso de subconsultas con alter sequence expressions

¿Es posible usar subconsultas dentro de expresiones alternativas en PostgreSQL?

Quiero alterar un valor de secuencia basado en un valor de columna de clave principal.

Intenté usar la siguiente expresión, pero no se ejecutaría.

secuencia alter public.sequenceX reiniciar con (select max (identificador de tabla) 1 de la tabla)

Gracias de antemano

Respuesta

55

no creo que pueda hacerlo así, pero se debería poder usar la dirección de la función setval, que es lo que hace el alter.

select setval('sequenceX', (select max(table_id)+1 from table), false) 

El falso hará que devuelva el siguiente número de secuencia exactamente como se proporciona.

+1

Exactamente lo ¡Estaba buscando! ¡Muchas gracias! – Danmaxis

+9

'select setval ('sequenceX', (select max (table_id) de la tabla))' logrará lo mismo, ya que el último parámetro, "is_llamado", por defecto es verdadero, pero también maneja correctamente el caso en el que podría haber creado esa secuencia con un valor INCREMENT BY distinto a 1. – chbrown

4

Además, si se han mezclado los nombres de objetos de casos y que está recibiendo un error como este:

ERROR: relation "public.mytable_id_seq" does not exist 

... usando la siguiente versión regclass debería ser útil:

select setval('"public"."MyTable_Id_seq"'::regclass, (select MAX("Id") FROM "public"."MyTable")) 
+0

me llevó un poco darme cuenta de las comillas simples alrededor de las comillas dobles! –