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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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