2011-01-12 8 views
6

cuando se borra todos los registros de una tabla de PostgreSQL y luego tratar de restablecer la secuencia para iniciar un nuevo registro con el número 1 cuando se inserta, i obtener resultados diferentes:secuencias Postgresql

SELECT setval('tblname_id_seq', (SELECT COALESCE(MAX(id),1) FROM tblname)); 

Esto establece la corriente valor de la secuencia a 1, pero el registro NEXT (en realidad el primero porque todavía no hay registros) obtiene el número 2!

Y no puedo configurarlo en 0, porque el valor mínimo en la secuencia es 1!

Cuando uso:

ALTER SEQUENCE tblname_id_seq RESTART WITH 1; 

el primer registro que se inserta en realidad recibe el número 1! Pero el código anterior no acepta un SELECT como un valor en lugar de 1.

Deseo restablecer la secuencia al número 1 cuando no hay registros, y el primer registro debe comenzar con 1. Pero cuando HAY ya los registros en la tabla, quiero restablecer la secuencia para que el siguiente registro que se inserta obtendrá {más alto} +1

¿Alguien tiene una solución clara para esto?

Respuesta

10

Utilice el formulario de tres argumentos de setval para establecer el indicador is_called a falso, por lo que devuelve el valor actual de la secuencia para la siguiente llamada nextval en lugar de generar de inmediato una nueva.

http://www.postgresql.org/docs/current/interactive/functions-sequence.html

También tenga en cuenta que necesita para utilizar COALESCE(MAX(id),0)+1, de lo contrario el primer valor de la secuencia será MAX(id), que sabes que ya existen. (thx Stephen Denne)

+2

Y use 'COALESCE (MAX (id), 0) + 1' –

+0

Sí, o de lo contrario la próxima identificación colisionará con MAX (id). – araqnid

+0

Genial, funciona ahora, gracias ... Miré ese parámetro, pero no funcionó cuando lo probé. Debo haber hecho algo mal ... – Dylan

2

Ver http://www.postgresql.org/docs/current/static/functions-sequence.html, cerca de la parte inferior de la página.

Específicamente, al menos en Postgresql 9.0, puede encontrar y establecer el valor de una secuencia. Puede usar la forma de tres argumentos de setval() para establecer el valor actual de la secuencia siguiente valor de la secuencia (que le permitiría establecer la secuencia en 1 en la próxima recuperación de valor).

+0

hah, 1 segundo de diferencia – araqnid