From: | Gunnar Wolf <gwolf(at)gwolf(dot)org> |
---|---|
To: | Javier Chavez Barra <jchavezb(at)gmail(dot)com> |
Cc: | Martin Marques <martin(at)marquesminen(dot)com(dot)ar>, postgresayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Actualizacion en Cascada de llave primaria |
Date: | 2007-11-12 17:29:30 |
Message-ID: | 20071112172930.GB6804@cajita.gateway.2wire.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
> > >diganme una cosa como se comportan esos campos en PG porque yo
> > >por norma siempre prefiero calcular el valor del campo cuando es
> > >una clave primaria porque me han pasado tallas en sqlserver al
> > >menos que esos campos a veces se corrompen
> >
> > Nunca me paso. ¿Qué significa que se corrompe el campo? ¿En qué
> > forma se corrompe?
>
> Es una larga historia!! pero por un motivo que no tengo la mas
> remota idea me calculo mal unas PK y al tratar de hacer un insert me
> reclamaba clave duplicada!!!.. :S fue por eso ... pero bueno puede
> que PG no sea asi ... era solo simple curiosidad
Como dices, quién sabe que haya pasado - pero si llegaste a esa
situación (tal vez insertando IDs a mano sin haberle pedido a Postgres
que lo haga a través de la secuencia - Recuerda que la secuencia es un
mecanismo independiente de la tabla, que sólo sabe incrementarse cada
que lo llamas, y si no lo llamas pos nomás no se incrementa), pero es
muy fácil de solucionar (remítase a [1]): Para una tabla llamada
articulos, asumiendo que tu PK es id, y que tu secuencia es
articulos_id_seq,
SELECT setval(articulos_id_seq', (SELECT id FROM articulos ORDER BY id DESC LIMIT 1));
> >Yo ya he escuchado muchas veces esto. Se puede actualizar
> >perfectamente si las referencias tienen el "ON CASCADE UPDATE".
> >
> >Una tabla de personas para mi tendria campos algo asi: id (PK de
> >tipo BIGSERIAL), tipodoc (INT REFERENCIA a una tabla donde estan
> >los tipos de documentos validos), numero (INT8 (y no me alcanza asi
> >siquiera) con el numero de documento), nombres (VARCHAR(120) o
> >mas... es por experiencia), apellido (VARCHAR(120) idem anterior).
> >
> >Despues cualquier tabla que tenga que tener como referencia a una
> >persona haria un REFERENCE persona(id). :-)
>
> Si pero = no se quiza soy un poco mas fundamentalista ... en ese
> sentido prefiero tener el control como programador .. y no darle esa
> responsabilidad al motor.. no se es simple asunto de crianza no.. no
> subirme al auto automatico hasta no aprender bien a manejar el
> mecanico... bueno pero es interesante... solo era curiosidad..
Me suena a que aprendiste a usar BDs con algo tipo MySQL, ¿verdad? Es
mucho más confiable dejar que la BD lo haga. Si no, puedes caer
fácilmente en condiciones de carrera - Por ejemplo, si tu programa
incluye un SELECT id FROM articulos ORDER BY id DESC LIMIT 1 para
encontrar si el ID más alto empleado, el cual es incrementado en 1, y
después viene un INSERT INTO articulos (id, otros_campos) VALUES
(el_nuevo_id, los_otros_valores) - ¿Qué pasa si llegan dos solicitudes
a la vez? Recuerda que la comunicación con Postgres es via sockets,
pues es entre dos procesos de sistema diferentes, e implica un cambio
de contexto para el sistema operativo. Puedes terminar con una
excepción por PK duplicada - A menos que implmentes un sistema de
locking, semáforos o lo que gustes. ¡Ah! Olvidaba decírtelo: La buena
gente de Postgres se tomó la molestia de implementarlo por tí. Se
llama "secuencias" ;-)
Saludos,
[1] http://www.postgresql.org/docs/8.1/static/functions-sequence.html
--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
From | Date | Subject | |
---|---|---|---|
Next Message | Gunnar Wolf | 2007-11-12 17:35:16 | Re: Actualizacion de 8.2.5 a 8.3 |
Previous Message | Alvaro Herrera | 2007-11-12 14:49:36 | Re: Actualizacion de 8.2.5 a 8.3 |