Re: comportamiento transaccional WITH

From: Jaime Casanova <jaime(dot)casanova(at)2ndquadrant(dot)com>
To: Hellmuth Vargas <hivs77(at)gmail(dot)com>
Cc: Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: comportamiento transaccional WITH
Date: 2017-09-04 00:42:08
Message-ID: CAJGNTeO68_mYh+Y4dsh7Zx5=qb5JEWC+B7rd18YErj+=mkymCQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On 10 August 2017 at 14:33, Hellmuth Vargas <hivs77(at)gmail(dot)com> wrote:
>
> Hola Lista
>
> Estaba revisando porque unas sentencias se ejecutaban y otras no con WITH y
> prepare este script para que ustedes me ayuden a entender:
>

Acabo de ver tu correo y me parecía un comportamiento extraño pero
conocido. La documentación señala lo que muestras en este párrafo de
https://www.postgresql.org/docs/9.6/static/sql-select.html#SQL-WITH
"""
The primary query and the WITH queries are all (notionally) executed
at the same time. This implies that the effects of a data-modifying
statement in WITH cannot be seen from other parts of the query, other
than by reading its RETURNING output. If two such data-modifying
statements attempt to modify the same row, the results are
unspecified.
"""

En otras palabras que durante la ejecución de la consulta, no verás
los cambios reflejados en las tablas finales sino sólo en las tablas
temporales (que se forman por la inclusión de la clausula returning)
que forman parte del WITH (en tu caso, la consulta principal debería
hacer referencia a base y a hijos)

por lo que, al menos en el primer ejercicio que mostraste, la consulta
debería ser así:
"""
with base as(insert into padre(id,texto) select a.dato,chr(dato) from
generate_series(33,255,1) as a(dato) returning id,texto),
hijos as (insert into hijo(id, texto, padre_id) select -a.id,'el
char de ' || a.id || 'es: ' || texto,a.id from base as a returning *)
select * from base as a join hijos as b on a.id=b.padre_id;
"""

PD: por favor, cuando copies una consulta evita pegar el prompt
(test=# en tu caso). sólo probe con la primera consulta porque no
tenía intenciones de limpiar las otras consultas para poderlas
ejecutar.

--
Jaime Casanova www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message jvenegasperu . 2017-09-04 16:36:22 tamaño de registro en Base de datos
Previous Message Maria Antonieta Ramirez 2017-09-01 17:08:57 Re: funcion replace