> -----Mensaje original-----
> De: Gabriel Messner
>
> esti...@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.
--
TIP 7: no olvides aumentar la configuración del "free space map"