Re: Actualizacion en Cascada de llave primaria

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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