Skip site navigation (1) Skip section navigation (2)

RE: Problema secuencia last_value

From: "Fernando Hevia" <fhevia(at)ip-tel(dot)com(dot)ar>
To: "'Gabriel Messner'" <gabmessner(at)gmail(dot)com>,<pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Problema secuencia last_value
Date: 2009-09-21 15:58:24
Message-ID: D79D1FBD5E5C409FBAEE51267AD161C8@iptel.com.ar (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
 

> -----Mensaje original-----
> De: Gabriel Messner
> 
> Estimad(at)s colisteros, expongo mi problema:
> 
> Tengo una base de datos con dos tablas:
> 
> La primera tabla ('propietarios') está formada por dos campos:
> 'id','nombre' donde id es un campo tipo serial con una 
> secuencia asociada 'propietario_id_seq'
> La segunda tabla ('parcelas') está formada por tres campos:
> 'id_propiet', 'ano_compra','id' donde 'id_propiet' es el 
> identificador único del propietario.
> 
> Para dar de alta un nuevo propietario en la tabla 1 y las 
> parcelas de su propiedad en la tabla 2 tengo un script en PHP 
> en el que ejecuto la siguiente sintaxis:
> 
> <?
> //no pongo la conexión a la base de datos
> 
> //inserto un propietario en la primera tabla 
> $insert_propietario = "INSERT INTO propietarios (nombre) 
> VALUES ('Manuel Alonso')"; pg_query($insert_propietario);
> 
> //Ahora quiero recuperar el id asignado por la secuencia 
> 'propietario_id_seq' a este usuario para pasarlo como 
> variable a la tabla 'parcelas'
> $lastid = "SELECT last_value from propietario_id_seq;"; 
> $qery_lastid = pg_query($lastid); $val_lastid = 
> pg_fetch_result($qery_lastid, 0, 0);
> 
> //inserto una fila en la tabla 'parcelas'
> $insert_parcela = "INSERT INTO parcelas 
> (ano_compra,id_propiet) VALUES ("2009",'". $val_lastid."')";
>         pg_query($insert_parcela);
> 
> 
> ?>
> 
> 
> Todo marcha bien hasta que reinicio el servidor postgres. 
> Justo después de reiniciarlo al insertar un nuevo propietario 
> no me devuelve el last_value de la secuencia.
> 
> Alguien puede decirme como solucionar esto o si estoy 
> enfocando mal el script?
> 

Si bien no encuentro explicación al error que mencionas, creo que estás
enfocando mal el script y en caso de concurrencia corres riesgo de asignar
parcelas al propietario incorrecto.
Sugeriría:

1º Obtener una secuencia:

$nextid = "SELECT nextval('propietario_id_seq');";

2º Insertar propietario:

$insert_propietario = 
  "INSERT INTO propietarios (id_propiet, nombre) 
  VALUES ('" . $nextid . "', 'Manuel Alonso')"; 
pg_query($insert_propietario);
 
3º Insertar parcelas:

$insert_parcela = 
  "INSERT INTO parcelas (ano_compra, id_propiet) 
  VALUES ("2009",'". $nextid ."')";
pg_query($insert_parcela);


Los pasos 2 y 3 debieran hacerse dentro de una transacción.

Saludos,
Fernando.


In response to

pgsql-es-ayuda by date

Next:From: Moises SilvaDate: 2009-09-21 16:20:26
Subject: dudas basicas
Previous:From: Alvaro HerreraDate: 2009-09-21 15:31:22
Subject: Re: Personalizar Mensajes de Exceptions

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group