Re: Reemplazar valor de un campo.

From: Alexys Lozada <alexyslc(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)surnet(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Reemplazar valor de un campo.
Date: 2005-06-16 13:29:02
Message-ID: 13a07860050616062928353245@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gracias a todos por sus respuestas.... envio algunas notas entre lineas:

On 6/15/05, Alvaro Herrera <alvherre(at)surnet(dot)cl> wrote:
> On Mon, Jun 13, 2005 at 06:16:23PM +0200, Alexys Lozada wrote:
>
> > codigo | nombre | apellido
> > ----------+-----------+------------
> > 120 | Pedro | Perez
> > 121 | Jorge | Ramirez
> > 130 | Arturo | Gomez
> > 142 | Daniel | Lozada
> >
> > y quiero con una funcion de plpgsql hacer el remplazo de esos codigos
> > para que queden asi:
> >
> > codigo | nombre | apellido
> > ----------+-----------+------------
> > 30 | Pedro | Perez
> > 31 | Jorge | Ramirez
> > 32 | Arturo | Gomez
> > 33 | Daniel | Lozada
>
> La primera pregunta que me surge es: para que?

jejejej, todos me han preguntado lo mismo. Resulta que tenemos una
aplicacion que corre en diferentes oficinas, pero gracias a la
tecnologia, podemos ahora centralizar toda esa información
(interconectando todas las oficinas por ADSL), lo que quiero en
realidad es renumerar este codigo para Unificar todas las bases de
datos en una sola. Claro en todas las oficinas hay codigos del 1 al
X, pero al momento de unificarlas tengo que tomar base por base y
renumerar su información del X+1 al Y. Por eso quiero hacer esta
funcion.

> Si es solo esa tabla es sencillo hacer una funcion que corrija los
> valores para que queden "sin agujeros en la secuencia numerica", supongo
> que es eso lo que quieres. Lo malo viene cuando tienes otras tablas que
> dependen de ese codigo (tengan llaves foraneas o no) -- en ese caso
> tienes que actualizar _ademas_ esas otras tablas teniendo cuidado con no
> equivocar los valores. Y si se te olvida una tabla, adios a todos los
> datos!

Claro, ya habia pensado en eso, asi que cambie los constraint de
RESTRICT a CASCADE, eso funciono a las mil maravillas.

> Antes que hacer eso yo realmente pensaria en una manera de _evitarme_
> hacer eso. Una regla de usar llaves numericas sin significado "natural"
> es que como no tienen significado, entonces no tiene sentido cambiarlas
> :-) (otra regla es que no debes cambiarlas nunca)

Bueno ya te comente, la unificacion.

En realidad mi pregunta era si habia otra forma a la que yo propuse
(que ya me funcionó pero me parece que esta muy larga):

CREATE FUNCTION unificar(nuecod integer) RETURN VOID AS $$
DECLARE
rs record;
renumerar integer;
BEGIN
renumerar=nuecod
FOR rs IN SELECT * FROM mitabla
LOOP
UPDATE mitabla SET codigo=renumerar WHERE codigo=rs.codigo;
renumerar=renumerar+1;
END LOOP;
RAISE NOTICE 'Codigos actualizados';
RETURN;
END;
$$ LANGUAGE plpgsql STRICT;

Esto ya me funcionó, pero pense que habia otra forma de ubicarme sobre
cada registro y reemplazar el dato, es decir, no hacer el UPDATE
mitabla..... pense que se podia hacer un replace o algo asi, porque en
mi muy poca experiencia con SQL, creo que el hacer el update con ese
condicional tiene que buscar en todos los registros el que coincida,
pero si yo pudiera simplemente pararme sobre el registro y cambiar el
dato seria GENIAL!!!.

Gracias por su paciencia y su tiempo.

---------------------------------------
Alexys Lozada

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Oswaldo Hernández 2005-06-16 13:54:58 Re: Grupos en un DataReport
Previous Message Pepe Ballaga 2005-06-16 12:29:06 duda con create function