RE: cambiar query insert por un update si el registro ya existe

From: César Piñera García <cesar(at)gafi(dot)com(dot)mx>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: cambiar query insert por un update si el registro ya existe
Date: 2008-04-23 23:12:37
Message-ID: 009901c8a597$85c53dc0$914fb940$@com.mx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Yo lo haría con un stored procedure (plpgsql) para hacer primero el update y
si no cambia nada entonces hacer el insert…

Update tarifa

Set idorigen=…

Where idorigen=…

get diagnostics x=row_count;

if x=0 then – no actualizo registros, por lo tanto no existe.

insert into tarifa

…

end if;

Saludos,

Ing. César Piñera García

De: Fernando Moreno [mailto:azazel(dot)7(at)gmail(dot)com]
Enviado el: miércoles, 23 de abril de 2008 01:02 p.m.
Para: Miguel
CC: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Re: [pgsql-es-ayuda] cambiar query insert por un update si el
registro ya existe

El día 23/04/08, Miguel <mmiranda(at)123(dot)com(dot)sv> escribió:

Saludos a todos, existe alguna forma de cambiar un query insert por un
update si la fila ya existe? Algo asi como insert or update tabla values
(xxxxx)
Me explico
digamos la tabla tarifa (idorigen int, iddestino int, tarifa numeric)
y tengo el archivo cvs tarifas.csv:
1,1,0.10
1,2,0.20
1,3,0.10
etc

Tengo un perl script que lee el archivo y ejecuta inserts en la tabla usando
un funcion inserta_tarifas(int,int,numeric), yo quiero usar el mismo archivo
independientemente si es para insertar nuevas o actualizar las antiguas de
manera que si la combinacion 1,1,0.10 ya existe y la primera fila que esta
en el archivo es 1,1,0.20, entonces un regla (o trigger) deberia verificar
si la fila ya existe y ejecutar un update en lugar de insertar otro registro
y que al final en la tabla no quede
1,1,0.10
1,1,0.20
sino que
1,1,0.20

Si necesitan mayor detalle favor hacermelo saber
---
Miguel
--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net

Un trigger que se active en cada inserción te podría servir. Dentro evalúas
los registros y en caso de encontrar un duplicado, actualizas los datos y
retornas null para saltarte la inserción. De esa forma seguirías ejecutando
sólo inserts. Aunque tengo mis dudas, nunca he usado triggers exactamente de
esa forma y no sé si el descartar la inserción también anule los cambios
hechos con update dentro de la función.

Por cierto, creo que un caso como el que mencionas ( 1,1,0.10 y 1,1,0.20) no
debería ser posible, ¿estás usando llave primaria en esa tabla?

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Marcos Saldivar 2008-04-24 00:05:27 Re: cambiar query insert por un update si el registro ya existe
Previous Message Alvaro Herrera 2008-04-23 21:21:49 Re: VACUUM y CLUSTER