Postgresql es uno de mis engines de base de datos favoritos, ya que puedes tener una gran libertad en elegir el lenguaje que quieres usar para tus funciones, procedimientos, triggers, etc.
Solo que hasta no hace mas de una semana lo volví a retomar para un proyecto laboral y del que necesita desempolvar los conocimientos aprendidos hace años.Uno de los problemas con los que me he topado ha sido la serialización en las tablas, como ocurre en los campos nombrados id que se incrementan automáticamente, sin embargo, el problema suele presentarse cuando agregas información a la tabla usando un id especifico.
Usando una tabla como la siguiente:
CREATE TABLE usuario(
id serial NOT NULL,
nombre character(50),
CONSTRAINT usuario_pk_id PRIMARY KEY (id)
)
Podemos ir agregando información son sentencias sencillas como las siguientes:
insert into usuario(nombre) values('jorge');
insert into usuario(nombre) values('andres');
También podemos hacerlo especificando el id y no habrá ningún problema.
insert into usuario(id,nombre) values(3,'alberto');
Sin embargo, al volver a insertar información sin especificar el id, para que éste sea generado automáticamente:
insert into usuario(nombre) values('pedro');
Obtenemos un grave error.
ERROR: duplicate key value violates unique constraint "usuario_pk_id"DETAIL: Key (id)=(3) already exists.
Por lo que deducimos que el serial id no se actualizó cuando insertamos información especificando el id. El problema se resuelve actualizando este serial key de la siguiente manera:
SELECT setval('usuario_id_seq', (SELECT MAX(id) FROM usuario)+1)
Una solución simple a un problema simple.
Jorge Hernandez :: http://jorgeluis.com.mx