Alvaro muchas gracias por la respuesta, ahora te pregunto, esta consideración
que me planteas también aplica al ejemplo que puse con CTE??
Acá te pongo nuevamente el ejemplo:
WITH CTE AS (
UPDATE prueba
SET
nombre = 'Lazaro'
WHERE id = 1 RETURNING id
)
INSERT INTO public.prueba
(
id,
nombre
)
SELECT 1, 'pepe' WHERE 1 NOT IN (SELECT CTE.id from CTE);
Un saludo.
________________________________________
De: Alvaro Herrera [[email protected]]
Enviado el: viernes, 29 de noviembre de 2013 11:43
Para: Lazaro Ruben Garcia Martinez
CC: [email protected]
Asunto: Re: [pgsql-es-ayuda] Sobre comando MERGE
Lazaro Ruben Garcia Martinez escribió:
> Buenos días a todos en la lista.
>
> Existe algún soporte en PostgreSQL para hacer uso de la funcionalidad
> MERGE/UPSERT?
>
> En caso de no existir una implementación utilizando CTE, podría ser factible
> como la siguiente:
No. Dos transacciones concurrentes haciendo lo mismo terminarían mal.
Realmente, la única forma de hacerlo es con un EXCEPTION en plpgsql que
intente un insert y si falla haga un update (o bien usando SAVEPOINTs y
ejecutando lo mismo directamente en vez de usar plpgsql).
Está en diseño una nueva forma de lidiar con este problema, que es algo
como INSERT..ON DUPLICATE KEY LOCK FOR UPDATE; puedes ver la (muy larga)
discusión en
http://www.postgresql.org/message-id/cam3swzthwrktvurf1awaih8qthgnmzafydcnw8qju7pqhk5...@mail.gmail.com
--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE
ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU!
http://www.antiterroristas.cu
http://justiciaparaloscinco.wordpress.com
Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE
ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU!
http://www.antiterroristas.cu
http://justiciaparaloscinco.wordpress.com
-
Enviado a la lista de correo pgsql-es-ayuda ([email protected])
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda