Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

problema con serial

Estas en el tema de problema con serial en el foro de PostgreSQL en Foros del Web. Buenas, yo tengo una tabla con un campo serial que es la llave primaria de la tabla: CREATE TABLE registro ( usuario character varying(100) NOT ...
  #1 (permalink)  
Antiguo 01/07/2009, 15:50
 
Fecha de Ingreso: julio-2009
Mensajes: 5
Antigüedad: 14 años, 9 meses
Puntos: 0
problema con serial

Buenas, yo tengo una tabla con un campo serial que es la llave primaria de la tabla:

CREATE TABLE registro
(
usuario character varying(100) NOT NULL,
cargo character varying(100) NOT NULL,
proyecto character varying(100),
actividad integer NOT NULL,
fecha date NOT NULL,
dia integer NOT NULL,
semana integer NOT NULL,
ano integer NOT NULL,
tiempo real NOT NULL,
id_registro serial NOT NULL,
CONSTRAINT registro_pkey PRIMARY KEY (id_registro))

La tabla venia funcionando bien pero despues de un tiempo el problema es que el campo id_registro (serial) iba en 64992 y algo le paso por que al hacer un insert en la tabla me retornaba llave duplicada, puede ser que se haya perdido la secuencia, quiero saber por que puede ser ese problema.....

por que me toco solucionarlo con el setval pero no quero que se repita el error, alguien sabe por que puede pasar esto?????
  #2 (permalink)  
Antiguo 01/07/2009, 17:51
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: problema con serial

Es raro..
Como controlas el campo? y las inserciones?
Lo mas recomendable es crear una secuencia (Que en teoría es lo mismo) pero ha tenido mejoras en el funcionamiento en las nuevas versiones.

Busca info de create sequence.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 02/07/2009, 07:42
 
Fecha de Ingreso: julio-2009
Mensajes: 5
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: problema con serial

Gracias huesos52,

es muy raro.... por que despues que le ejecute el: SELECT setval('registro_id_seq',64992) ah funcionado correctamente, el insert es:

INSERT INTO registro values (usuario,cargo,proyecto,actividad,fecha,dia,semana ,año,tiempo)

cual es el tope máximo que puede llegar el campo serial?? el problema puede ser por que se eliminó un registro de la tabla????, por que se pudo haber eliminado el ultimo y por eso se daño. O será que por insertar un registro manualmente se pierde la secuencia, es que tengo el pgAdmin III y puede ser que alguien haya insertado el registro en la tabla dandole el serial y al intentar hacer el insert que hace normalmente intentó insertar y ya existia la llave???? por ke el error que sale es "duplicate key violates unique constraint "registro_pkey"

saludos,

Última edición por dagl3; 02/07/2009 a las 08:13
  #4 (permalink)  
Antiguo 03/07/2009, 05:23
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: problema con serial

Cita:
cual es el tope máximo que puede llegar el campo serial??
Tomado de la documentación oficial de postgres.
Cita:
serial 4 bytes autoincrementing integer 1 to 2147483647
Si requieres de mas registros, puedes usar un bigserial. Pero te repito, cambia el tipo de dato serial y reemplazalo por una secuencia. Son mas estables.

Con respecto al por que se dañó, podría ser un bug que tiene algún tipo de falla ante una transacción, pero ni idea.
Sospechaba que el insert lo hiciera controlando el conteo desde la aplicación, en ese caso, le echariamos la culpa a un error en el software, pero si se establecen los campos e el insert si creo que es un error de postgres.

Un saludo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:10.