[Pgsql-ayuda] HELP: con SECUENCIAS y el currval

Rodrigo Gallardo lgallardo@computacion.cs.cinvestav.mx
03 Feb 2003 19:13:12 -0600


>>>>> "Ronald" =3D=3D Ronald Serna <rserna@correo.inictel.gob.pe> writes:

    > Amigos estoy trabajando con secuencias.  Revisando la
    > docuementacion hay un apartado que AVISA que el nextval puede
    > generar valores fuera de secuencia, (lo cual seria muy
    > desastrozo para cualquier disenno BD) cuando en el backend
    > cachea el proceso de generacion(Como es esto y como
    > comprobarlo??) de secuebncias.

No es desastrozo. El chiste de las secuencias es generar un
identificador unico para cada registro. Por motivos de eficiencia, una
transacci=F3n puede reservar varios n=FAmeros de la secuencia por
adelantado, por si se insertan varios registros. Y si resulta que
tardas en insertarlos otra transacci=F3n puede inserat antes que t=FA, con
n=FAmeros reservados despues. =BFComo comprobarlo? A posteriori, obten los
registros en el orden que salen naturalmente (sin SORT) y ve si la
secuencia est=E1 en orden. Pero en todo caso esto no te importa. No se
usan secuencias para ver el orden de inserci=F3n, sino s=F3lo pare generar
identificadores =FAnicos. Si el orden de inserci=F3n es importante, usa un
timestamp.=20


    > Para obtener el currval(), ejecuto: SELECT
    > currval('estudiante_id_estudiante_seq') y obtengo del
    > phpPgAdmin: ERROR: estudiante_id_estudiante_seq.currval is not
    > yet defined in this session Your query:

    > Por Que es esto??
Parte de la optimizaci=F3n anterior. El currval() no est=E1 definido sino
hasta despues de hacer un nextval(). Normalmente no importa, por que
no lo usas deirectamente, sino que dejas que un trigger lo meta cuando
insertas en una tabla. Si deveras requieres saber con que id qued=F3 un
registro al insertarlo haces algo como:

select next_val()
construye el insert con el id obtenido
inserta el registro


--=20
Charlie was a chemist,
But Charlie is no more.
For what he thought was H2O,
Was H2SO4.

Rodrigo
PGP key 1024D/ADC9BC28 2002-02-26 [expires 2004-02-26]
Fingerprint: 7C81 E60C 442E 8FBC D975  2F49 0199 8318 ADC9 BC28